home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
PC World 2002 December
/
PCWorld_2002-12_cd.bin
/
Software
/
Komercni
/
Baltik
/
katB.exe
/
katB
/
BACKTRAQ
/
BACKTRAQ.MOD
/
SHARED.INC
< prev
next >
Wrap
Text File
|
2002-09-20
|
15KB
|
332 lines
// sdílené konstanty
// konstanty pro hodnoty prom╪nné mod_ReºimObrazovky
# define mod_TEXTOVφ_REªIM 1
# define mod_GRAFICKφ_REªIM 2
// konstanty uºivatelsk∞ch v∞stupà v grafickém reºimu
# define mod_GRAFIKA_VφSTUP_MOJEPLOCHA GrV∞stupUºivatelsk∞1
# define mod_GRAFIKA_VφSTUP_POKYN GrV∞stupUºivatelsk∞2
// konstanty sou²adnic uºivatelsk∞ch v∞stupà v grafickém reºimu
# define mod_GRAFIKA_VφSTUP_POKYN_X1 2
# define mod_GRAFIKA_VφSTUP_POKYN_X2 637
# define mod_GRAFIKA_VφSTUP_POKYN_Y1 20
# define mod_GRAFIKA_VφSTUP_POKYN_Y2 29
# define mod_GRAFIKA_VφSTUP_MOJEPLOCHA_X1 2
# define mod_GRAFIKA_VφSTUP_MOJEPLOCHA_X2 637
# define mod_GRAFIKA_VφSTUP_MOJEPLOCHA_Y1 35
# define mod_GRAFIKA_VφSTUP_MOJEPLOCHA_Y2 477
// konstanty sou²adnic v grafickém reºimu ve v∞stupu Plocha
# define mod_GRAFIKA_Z╡HLAV╓_X 2
# define mod_GRAFIKA_Z╡HLAV╓_Y 2
# define mod_GRAFIKA_Z╡HLAV╓_PODTRªEN╓_X1 2
# define mod_GRAFIKA_Z╡HLAV╓_PODTRªEN╓_X2 637
# define mod_GRAFIKA_Z╡HLAV╓_PODTRªEN╓_Y 13
// konstanty pro hodnoty prom╪nné mod_Hledanáⁿeτení
# define mod_VµECHNA_ⁿEµEN╓ 1
# define mod_JAKÉKOLIV_ⁿEµEN╓ 2
// konstanty pro hodnoty prom╪nné mod_ZobrazovanéPozice
# define mod_POUZE_ⁿEµEN╓ 1
# define mod_VµECHNY_POZICE 2
// konstanty pro sm╪r t²íd╪ní pouºívan∞ funkcí QuickSort
# define mod_QUICKSORT_ASC 1
# define mod_QUICKSORT_DESC -1
// konstanty pro ƒekání po zobrazení hláτky pouºívané funkcí mod_VypiτHláτku
# define mod_VYPIµHL╡µKU_NE¼EKEJ 0 // neƒeká se
# define mod_VYPIµHL╡µKU_VY¼KEJ 1 // chvíli se vyƒká (pouze grafika)
# define mod_VYPIµHL╡µKU_¼EKEJNAKL╡VESU 2 // ƒeká se na stisk klávesy
# define mod_VYPIµHL╡µKU_¼EKEJNAKL╡VESUGRAFIKA 3 // ƒeká se na stisk klávesy (pouze grafika)
// sdílené prom╪nné
int mod_ReºimObrazovky; // pouºit∞ reºim obrazovky (viz konstanty)
int mod_Hledanáⁿeτení; // jaká ²eτení hledat (viz konstanty)
int mod_Poƒetⁿeτení; // poƒet nalezen∞ch ²eτení
int mod_ZobrazovanéPozice; // zda zobrazovat pouze ²eτení nebo vτechny pozice (viz konstanty)
int mod_¼ekatNaKlávesu; // zda po nalezení ²eτení ƒekat na stisk klávesy
int mod_ZapisovatProtokol; // zda zapisovat protokol o v∞poƒtu do souboru
string mod_ZapisovatProtokol_Název; // název souboru, kam protokol zapisovat
TypSoubor mod_ZapisovatProtokol_Soubor; // soubor, kam protokol zapisovat
string mod_NechZvolit_Volby[2]; // parametr sdílené funkce NechZvolit()
char mod_NechZvolit_AccessKeys[2]; // parametr sdílené funkce NechZvolit()
Typ¼as mod_¼asStart; // ƒas zaƒátku v∞poƒtu
Typ¼as mod_¼asHotovo; // ƒas dokonƒení v∞poƒtu
Typ¼as mod_¼asRozdíl; // doba trvání v∞poƒtu (rozdíl ƒasu zaƒátku a dokonƒení)
int* mod_QuickSort_Pole; // ukazatel na pole t²ízené funkcí QuickSort
// ve²ejné prom╪nné
int mod_HledatDál; // urƒuje, zda pokraƒovat v backtrackingu
// sdílené funkce
// [univerzální funkce]
double pow(double base, double power) {
double result=1;
while(power-->0) result*=base;
return result;
}
void GrPiτⁿet╪zecWordWrap(char* ⁿet╪zec, int X1, int Y1, int X2, int Y2, int center) {
int ⁿet╪zecPozice = 0;
int PoƒetZnakàNaⁿádek = integer((X2-X1+1)/8);
string ⁿet╪zecKZobrazení;
GrNastavPozici(X1,Y1);
while(ⁿet╪zecPozice < StrDélka(ⁿet╪zec)) {
ⁿet╪zecKZobrazení = StrKopie(ⁿet╪zec,ⁿet╪zecPozice,PoƒetZnakàNaⁿádek);
if(ⁿet╪zecPozice+PoƒetZnakàNaⁿádek < StrDélka(ⁿet╪zec) && strchr(ⁿet╪zec,' ')) ⁿet╪zecKZobrazení = StrKopie(ⁿet╪zecKZobrazení,0,strrchr(ⁿet╪zecKZobrazení,' ')-(char*)ⁿet╪zecKZobrazení+1);
ⁿet╪zecPozice += StrDélka(ⁿet╪zecKZobrazení);
if(center) GrNastavPoziciRel((PoƒetZnakàNaⁿádek-StrDélka(ⁿet╪zecKZobrazení))*8/2, 0);
GrPiτⁿet╪zec(ⁿet╪zecKZobrazení);
GrNastavPozici(X1,GrPoziceY()+10);
}
}
string StrL¼ísloZeroPad(long ¼íslo, int Délka) {
string zeropadded = StrL¼íslo(¼íslo, -1);
while(StrDélka(zeropadded) < Délka) zeropadded = "0" + zeropadded;
return zeropadded;
}
void mod_QuickSort(int low, int high, int order) {
int i, j;
{
int pilot, temp;
i = low;
j = high;
pilot = mod_QuickSort_Pole[(int)integer((low+high)/2)];
while(i <= j) {
while(order==mod_QUICKSORT_ASC?(mod_QuickSort_Pole[i] < pilot):(mod_QuickSort_Pole[i] > pilot)) i++;
while(order==mod_QUICKSORT_ASC?(mod_QuickSort_Pole[j] > pilot):(mod_QuickSort_Pole[j] < pilot)) j--;
if(i <= j) {
temp = mod_QuickSort_Pole[i];
mod_QuickSort_Pole[i] = mod_QuickSort_Pole[j];
mod_QuickSort_Pole[j] = temp;
i++;
j--;
}
}
}
if(low < j) mod_QuickSort(low, j, order);
if(high > i) mod_QuickSort(i, high, order);
}
// [jednoúƒelové funkce]
void MyτZapni() { // zapne obsluhu událostí myτi
MyτZaƒátekObsluhy();
MyτNastavRozsah(mod_GRAFIKA_VφSTUP_MOJEPLOCHA_X1, mod_GRAFIKA_VφSTUP_MOJEPLOCHA_Y1, mod_GRAFIKA_VφSTUP_MOJEPLOCHA_X2, mod_GRAFIKA_VφSTUP_MOJEPLOCHA_Y2);
}
void MyτVypni() { // vypne obsluhu událostí myτi
MyτKonecObsluhy();
}
void mod_InicializujGrafiku(void) { // inicializace grafiky
// inicializace v∞stupu Plocha
GrNastavV∞stup(GrV∞stupPlocha);
GrNastavBarvuPozadí(Pal¼erná);
GrSmaºOkno();
GrNastavText(GrTextBezPozadí);
// vykreslení obsahu v∞stupu Plocha
GrNastavBarvy(PalTmav╪µedá<<4|PalTmav╪µedá);
GrKresliObdélník(0,0,639,479);
GrKresliVypln╪n∞Obdélník(0,0,639,mod_GRAFIKA_VφSTUP_MOJEPLOCHA_Y1-2);
GrNastavBarvuPop²edí(PalBéºová);
GrKresliObdélník(mod_GRAFIKA_VφSTUP_MOJEPLOCHA_X1-1, mod_GRAFIKA_VφSTUP_MOJEPLOCHA_Y1-1, mod_GRAFIKA_VφSTUP_MOJEPLOCHA_X2+1, mod_GRAFIKA_VφSTUP_MOJEPLOCHA_Y2+1);
GrNastavBarvuPop²edí(PalBílá);
GrNastavPozici(mod_GRAFIKA_Z╡HLAV╓_X,mod_GRAFIKA_Z╡HLAV╓_Y);
GrPiτⁿet╪zec(AktivníModul->DlouhéJméno);
GrKresliLinku(mod_GRAFIKA_Z╡HLAV╓_PODTRªEN╓_X1,mod_GRAFIKA_Z╡HLAV╓_PODTRªEN╓_Y,mod_GRAFIKA_Z╡HLAV╓_PODTRªEN╓_X2,mod_GRAFIKA_Z╡HLAV╓_PODTRªEN╓_Y);
GrNastavBarvy(Pal¼erná<<4|PalBílá);
// inicializace v∞stupu Pokyn
GrNastavV∞stup(mod_GRAFIKA_VφSTUP_POKYN | GrV∞stupUºivatelsk∞Nastavení, mod_GRAFIKA_VφSTUP_POKYN_X1, mod_GRAFIKA_VφSTUP_POKYN_Y1, mod_GRAFIKA_VφSTUP_POKYN_X2, mod_GRAFIKA_VφSTUP_POKYN_Y2);
GrNastavV∞stup(mod_GRAFIKA_VφSTUP_POKYN);
GrNastavBarvy(PalTmav╪µedá<<4|Palªlutá);
GrNastavText(GrTextBezPozadí);
// inicializace v∞stupu Moje plocha
GrNastavV∞stup(mod_GRAFIKA_VφSTUP_MOJEPLOCHA | GrV∞stupUºivatelsk∞Nastavení, mod_GRAFIKA_VφSTUP_MOJEPLOCHA_X1, mod_GRAFIKA_VφSTUP_MOJEPLOCHA_Y1, mod_GRAFIKA_VφSTUP_MOJEPLOCHA_X2, mod_GRAFIKA_VφSTUP_MOJEPLOCHA_Y2);
GrNastavV∞stup(mod_GRAFIKA_VφSTUP_MOJEPLOCHA);
GrNastavBarvy(PalBéºová<<4|PalBílá);
GrSmaºOkno();
GrNastavText(GrTextBezPozadí);
// nastavení v∞stupu Moje plocha jako aktivního p²i ukonƒení funkce
GrNastavV∞stup(mod_GRAFIKA_VφSTUP_MOJEPLOCHA);
}
void mod_Ukli╘Grafiku(void) {
// nastavení grafického módu, pokud byl aktivní mód textov∞
if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) GrNastavMód(GrMódVGA);
}
void mod_VypiτHláτku(string mod_TextHláτky, int mod_¼ekání) {
// zobrazení hláτky do textového okénka naho²e
if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
if(TxtPoziceY() != 0) TxtPiτNov∞ⁿádek();
TxtPiτⁿet╪zec(mod_TextHláτky);
TxtPiτNov∞ⁿádek();
}
else if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) {
int mod_PàvodníV∞stup = GrNastavV∞stup(mod_GRAFIKA_VφSTUP_POKYN);
GrSmaºOkno();
GrNastavPozici(0,0);
GrPiτⁿet╪zec(mod_TextHláτky);
GrNastavV∞stup(mod_PàvodníV∞stup);
}
switch(mod_¼ekání) {
case mod_VYPIµHL╡µKU_NE¼EKEJ:
break;
case mod_VYPIµHL╡µKU_VY¼KEJ:
if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) ¼ekej(2000);
break;
case mod_VYPIµHL╡µKU_¼EKEJNAKL╡VESU:
¼ekejNaKlávesu();
break;
case mod_VYPIµHL╡µKU_¼EKEJNAKL╡VESUGRAFIKA:
if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) ¼ekejNaKlávesu();
break;
}
}
int mod_VolbaReºimuObrazovky(void) { // volba grafického / textového reºimu
mod_InicializujGrafiku();
// zobrazení loga problému
NastavJménoBankyP²edm╪tà("*\\backtraq");
GrKresliP²edm╪ty(1,1,145,50,9,3);
NastavJménoBankyP²edm╪tà("*\\backtraq.mod\\"+AktivníModul->KrátkéJméno);
GrKresliP²edm╪ty(1,1,145,50,9,3);
// zobrazení popisu problému
GrNastavBarvuPop²edí(Pal¼erná);
GrPiτⁿet╪zecWordWrap(AktivníModul->Popis, 20, 50+3*29+30, GrMaxX()-20, GrMaxY()-10, 1);
// volba reºimu obrazovky
mod_ReºimObrazovky = mod_GRAFICKφ_REªIM;
mod_VypiτHláτku("Stiskn╪te T pro ²eτení v textovém reºimu, cokoliv jiného pro grafick∞ reºim...", mod_VYPIµHL╡µKU_NE¼EKEJ);
¼tiKlávesuZFrontyS¼ekáním();
if(gKlávesa == KlEsc) return 0;
if(StrNaVelká((string)(char)gKlávesa) == "T") mod_ReºimObrazovky = mod_TEXTOVφ_REªIM;
else mod_ReºimObrazovky = mod_GRAFICKφ_REªIM;
return 1;
}
int mod_NechZvolit(string mod_Otázka) {
// nechá uºivatele zvolit jednu z nabízen∞ch moºností
int mod_Volba, mod_Zvoleno = -1;
if(mod_ReºimObrazovky == mod_TEXTOVφ_REªIM) {
mod_VypiτHláτku(mod_Otázka, mod_VYPIµHL╡µKU_NE¼EKEJ);
for(mod_Volba=0; mod_Volba<2; mod_Volba++) {
TxtPiτⁿet╪zec("["+mod_NechZvolit_AccessKeys[mod_Volba]+"] "+mod_NechZvolit_Volby[mod_Volba]+"\n");
}
do{
¼tiKlávesuS¼ekáním();
gKlávesa = czchrlwr(gKlávesa);
for(mod_Volba=0; mod_Volba<2; mod_Volba++) {
if(gKlávesa == mod_NechZvolit_AccessKeys[mod_Volba]) mod_Zvoleno = mod_Volba;
}
if(mod_Zvoleno == -1) { Tón(1000); ¼ekej(200); VypniTón(); }
}while(mod_Zvoleno == -1);
}
else if(mod_ReºimObrazovky == mod_GRAFICKφ_REªIM) {
mod_VypiτHláτku("Vyberte pomocí myτi jednu z nabízen∞ch moºností.", mod_VYPIµHL╡µKU_NE¼EKEJ);
int mod_PàvodníBarvy = GrBarvy();
NastavJménoBankyP²edm╪tà("*\\backtraq");
GrSmaºOkno();
GrNastavBarvuPop²edí(Pal¼erná);
GrNastavPozici(636/2-StrDélka(mod_Otázka)*8/2, 140);
GrPiτⁿet╪zec(mod_Otázka);
int mod_Vypisovan∞Znak, mod_VypsánaAccessKey;
for(mod_Volba=0; mod_Volba<2; mod_Volba++) {
GrNastavPozici(636/2-4*39/2, 140+30+(29+15)*mod_Volba);
GrKresliP²edm╪ty(12,1,GrPoziceX(),GrPoziceY(),4,1);
GrNastavPoziciRel((4*39-StrDélka(mod_NechZvolit_Volby[mod_Volba])*8)/2, 10); // vyst²ed╪ní textu
mod_VypsánaAccessKey = 0;
for(mod_Vypisovan∞Znak=0; mod_Vypisovan∞Znak<StrDélka(mod_NechZvolit_Volby[mod_Volba]); mod_Vypisovan∞Znak++) {
if(!mod_VypsánaAccessKey && mod_NechZvolit_Volby[mod_Volba][mod_Vypisovan∞Znak] == mod_NechZvolit_AccessKeys[mod_Volba]) {
// vypisované písmeno je access key
GrNastavBarvuPop²edí(Pal¼ervená);
mod_VypsánaAccessKey = 1;
}
else {
// vypisované písmeno je normální písmeno
GrNastavBarvuPop²edí(Pal¼erná);
}
GrPiτZnak(mod_NechZvolit_Volby[mod_Volba][mod_Vypisovan∞Znak]);
}
}
MyτZapni();
MyτNastavGrKurzor(25);
MyτNastavPozici(mod_GRAFIKA_VφSTUP_MOJEPLOCHA_X1+636/2, mod_GRAFIKA_VφSTUP_MOJEPLOCHA_Y1+140+30+29/2);
MyτVyprázdniFrontuUdálostí();
MyτZobrazKurzor();
do{
do{
Myτ¼tiUdálost(gMyτUdálost);
}while(gMyτUdálost.Typ != MyτUdálostLevéTlNahoru && !BylaStisknutaKlávesa());
if(gMyτUdálost.Typ == MyτUdálostLevéTlNahoru) {
gMyτUdálost.X -= mod_GRAFIKA_VφSTUP_MOJEPLOCHA_X1;
gMyτUdálost.Y -= mod_GRAFIKA_VφSTUP_MOJEPLOCHA_Y1;
if(abs(636/2-gMyτUdálost.X) <= 4*39/2) {
if(gMyτUdálost.Y >= 140+30 && gMyτUdálost.Y <= 140+30+2*29+(2-1)*15) {
if((gMyτUdálost.Y-(140+30))%(29+15) <= 28) mod_Zvoleno = integer(gMyτUdálost.Y-(140+30))/(29+15);
}
}
}
else if(BylaStisknutaKlávesa()) {
¼tiKlávesuZFronty();
gKlávesa = czchrlwr(gKlávesa);
for(mod_Volba=0; mod_Volba<2; mod_Volba++) {
if(gKlávesa == mod_NechZvolit_AccessKeys[mod_Volba]) mod_Zvoleno = mod_Volba;
}
}
}while(mod_Zvoleno == -1);
MyτSchovejKurzor();
MyτVypni();
GrSmaºOkno();
NastavJménoBankyP²edm╪tà("*\\backtraq.mod\\"+AktivníModul->KrátkéJméno);
GrNastavBarvy(mod_PàvodníBarvy);
}
return mod_Zvoleno;
}
void mod_ProtokolZapiτStart1(void) {
mod_ZapisovatProtokol_Soubor = SouborOtev²i(mod_ZapisovatProtokol_Název, SouborP²ístupZápis|SouborP²ístupTextov∞);
SouborU²ízni(mod_ZapisovatProtokol_Soubor);
SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Protokol o v∞poƒtu provedeném programem Backtraq (C) 2001-2002 Marek Blahuτ\n");
SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "---------------------------------------------------------------------------\n");
TypDatum mod_Datum;
SystémovéDatum(mod_Datum);
SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "V∞poƒet proveden: " +StrL¼ísloZeroPad(mod_Datum.Den,2)+"."+StrL¼ísloZeroPad(mod_Datum.M╪síc,2)+"."+StrL¼ísloZeroPad(mod_Datum.Rok,4)+"\n");
SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Pouºit∞ modul: " + AktivníModul->KrátkéJméno + " (" + AktivníModul->DlouhéJméno + ")\n");
SouborPiτNov∞ⁿádek(mod_ZapisovatProtokol_Soubor);
SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Parametry v∞poƒtu:\n");
SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "------------------\n");
}
void mod_ProtokolZapiτStart2(void) {
SouborPiτNov∞ⁿádek(mod_ZapisovatProtokol_Soubor);
SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Pràb╪h v∞poƒtu:\n");
SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "---------------\n");
SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Start: "+StrL¼ísloZeroPad(mod_¼asStart.Hodiny,2)+":"+StrL¼ísloZeroPad(mod_¼asStart.Minuty,2)+":"+StrL¼ísloZeroPad(mod_¼asStart.Sekundy,2)+"."+StrL¼ísloZeroPad(mod_¼asStart.Setiny,2)+"\n");
}
void mod_ProtokolZapiτHotovo(void) {
SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "---------------\n");
SouborPiτNov∞ⁿádek(mod_ZapisovatProtokol_Soubor);
SouborPiτⁿet╪zec(mod_ZapisovatProtokol_Soubor, "Konec souboru.\n");
SouborZav²i(mod_ZapisovatProtokol_Soubor);
}
void mod_V∞poƒetDobyTrváníV∞poƒtu(void) {
long mod_¼asRozdílSS = ¼asRozdíl(mod_¼asHotovo, mod_¼asStart);
mod_¼asRozdíl.Setiny = mod_¼asRozdílSS%100;
mod_¼asRozdílSS = integer(mod_¼asRozdílSS/100);
mod_¼asRozdíl.Sekundy = mod_¼asRozdílSS%60;
mod_¼asRozdílSS = integer(mod_¼asRozdílSS/60);
mod_¼asRozdíl.Minuty = mod_¼asRozdílSS%60;
mod_¼asRozdílSS = integer(mod_¼asRozdílSS/60);
mod_¼asRozdíl.Hodiny = mod_¼asRozdílSS%24;
mod_¼asRozdílSS = integer(mod_¼asRozdílSS/24);
}