/*************************************************************************** * * * 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 #include #include #include #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 "<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: "<nast; delete pierwszy_element; } } if(debug_level) { if (language==0) { cout<etykieta<kolejny_numer<kolejny_numer_string<nast; } else { cout<<"Label "<etykieta<kolejny_numer<kolejny_numer_string<nast; } } if(language==0) { cout<<"Zakończyłem pracę z plikiem "<etykieta: "<<(*wierzcholek)->etykieta<etykieta: "<<(*wierzcholek)->etykieta<kolejny_numer_string<kolejny_numer_string<kolejny_numer_string: " <<(*zmienna_tymczasowa)->kolejny_numer_string<kolejny_numer_string: " <<(*zmienna_tymczasowa)->kolejny_numer_string<kolejny_numer_string<-1) { int *taka_sobie_zmienna=&kolejnosc; if(podaj_etykiete_liczbe(linia,etykieta,taka_sobie_zmienna)) { if(language==0) { cout<<"****************************************************************"<etykieta<etykieta<etykieta<<" została włożona."<etykieta<<" is placed."<etykieta); if(debug_level) { if(language==0) { cout<<"Ustawianie zmiennej klasaa_obslugi_etykiet.numer_etykietki: " <etykieta); if(rekord->etykieta[dlugosc-2]=='.'&&dlugosc>=5) { if(debug_level) { if(language==0) { cout<<"Etykietka wygląda następująco: mblah.a."<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."<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."<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<<"************************************************************"<kolejny_numer<etykieta<kolejny_numer_string<kolejny_numer<etykieta<kolejny_numer_string<etykieta<<" na globalnej kolejce etykiet."<etykieta<<" exists ini the lobal label queue."<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: "<etykieta<<" została znaleziona na globalnej liście. Opuszczam funkcję."<etykieta<<" found in the global label queue. Leaving function."<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: "<etykieta<<" nie została znaleziona na liście. Wkładam ją tam"<etykieta<<" not found in the queue. Inserting."<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<<"****************************"<etykieta,dlugosc-2); root_label[dlugosc-2]='\0'; if(debug_level) { if(language==0) { cout<<"root_label wygląda: "<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: "<etykieta<<" found in the global label quere. Its number was copied."<etykieta); if(debug_level) { if(language==0) { cout<<"Etykietka została pobrana używając funkcji ustaw_zmienną_numer_etykietki"<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<<"****************************************************************"<etykieta: "<etykieta<etykieta: "<etykieta<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."<kolejny_numer; (*zmienna_tymczasowa)=bierzacy; if(debug_level) { if(language==0) { cout<<"Wychodzę z funkcji zwroc_numer_etykiety z błędem 1."<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