/***************************************************************************** * * * Subor ADRESAR.C * * * *****************************************************************************/ #include #include #include #include #include #include #include "key.h" #include "glob.h" #include "menu.h" #include "video.h" #include "okno.h" #include "line_edi.h" #include "error.h" #include "util.h" #include "adresar.h" //************************************************************************// // CITAJ_MENO_SUBORU // // i:meno, typ citania o:meno 30.10.1997 // //************************************************************************// int citaj_meno_suboru(char *meno, int citanie) { int zx; int zy; char pom[256]; int koniec=-1; strcpy(pom,meno); zx=_stlpcov/2-24; zy=_riadkov/2-10; if(otvor_okno(zx,zy,zx+48,zy+20,atributy[10],atributy[11],3)==FALSE) return FALSE; tlac_riadok_help(" ~F1 Pomoc ³ ~Tab Adres r->S£bor ~Enter V˜ber",atributy[4],atributy[5]); if (citanie) tlac_retazec(zx+16,zy,atributy[11]," €¡taj s£bor "); else tlac_retazec(zx+16,zy,atributy[11]," Zap¡¨ s£bor "); tlac_retazec(zx+2,zy+18,atributy[14], " "); tlac_retazec(zx+2,zy+2,atributy[12], " "); tlac_retazec(zx+2,zy+1,atributy[10], "S£bor"); tlac_retazec(zx+2,zy+4,atributy[10], "Adres r"); tlac_retazec(zx+2,zy+17,atributy[10], "Cesta"); zobraz_aktualny_adresar(zx,zy,meno); riadkovy_editor(zx+2,zy+2,43,80,atributy[13],atributy[12],pom); koniec=FALSE; if ( strchr(pom,'*') || strchr(meno,'?') ) // ak je hviezdickova konvencia pokracuj { while (koniec==FALSE) switch(adresar(zx,zy,pom,meno)) { case TRUE: koniec=TRUE; break; case FALSE: koniec=riadkovy_editor(zx+2,zy+2,43,80,atributy[13],atributy[12],pom); break; case ESC: koniec=FALSE; zatvor_okno(); return koniec; break; } } else // k if (citanie { koniec=TRUE; strcpy( meno,pom ); } zatvor_okno(); return koniec; } //************************************************************************// // ADRESAR zobrazi adresarovu strukturu // // 30.10.1997 // //************************************************************************// int adresar(int zx,int zy,char *path,char *plne_meno) { char cesta[80]; char meno[80]; char *p; struct Adresar *adresar; int pocet_riadkov; int zaciatocny; int aktualny; register int i=0; int kl; int posun; int zmena_katalogu; adresar=farmalloc( 512 * sizeof(struct Adresar)); pamet(); if(adresar == NULL) { error(3); return FALSE; } switch(kontroluj_path(path,cesta,meno)) { case 4:chybove_okno(chyba[0]); chyba_hard=0; farfree(adresar); pamet(); return FALSE; case 3:chybove_okno(chyba[3]); farfree(adresar); pamet(); return FALSE; case 2:chybove_okno(chyba[6]); farfree(adresar); pamet(); return FALSE; case 1:strcpy(plne_meno,cesta); strcat(plne_meno,meno); farfree(adresar); pamet(); return TRUE; } while(1) { zmena_katalogu=0; posun=1; aktualny=0; zaciatocny=0; if(strlen(cesta)>44) { tlac_retazec(zx+2,zy+18,atributy[14],&cesta[strlen(cesta)-45]); tlac_znak(zx+2,zy+18,atributy[14],17); } else { tlac_retazec(zx+2,zy+18,atributy[14],cesta); for(i=strlen(cesta);i<44;i++) tlac_znak(zx+2+i,zy+18,atributy[14],' '); } if((pocet_riadkov=vypln_adresar(meno,cesta,adresar))!=0) { while(!zmena_katalogu) { if(posun==1) { tlac_adresar(zx,zy,zaciatocny,pocet_riadkov,adresar); posun=0; } obdlznik(zx,zy,aktualny,atributy[16]); kl=key(); obdlznik(zx,zy,aktualny,atributy[15]); switch(kl) { case ESC: farfree(adresar); pamet(); return ESC; case TAB: farfree(adresar); pamet(); return FALSE; case ENTER:if(adresar[zaciatocny+aktualny].meno[0]=='.') { i=strlen(cesta)-2; while(cesta[i]!='\\')i--; cesta[i+1]='\0'; zmena_katalogu=1; } else if(adresar[zaciatocny+aktualny].typ==DIRECTORY) { strcat(cesta,adresar[zaciatocny+aktualny].meno); p=&cesta[strlen(cesta)-1]; while(*p==' ')p--; p++; *p++='\\'; *p='\0'; zmena_katalogu=1; } else { strcpy(plne_meno,cesta); strcat(plne_meno,adresar[zaciatocny+aktualny].meno); strcat(plne_meno,"."); strcat(plne_meno,adresar[zaciatocny+aktualny].konc); farfree(adresar); pamet(); return TRUE; } strcpy(path,cesta); strcat(path,meno); break; case UP:if(--aktualny<0) if(zaciatocny!=0) { aktualny=10; if(zaciatocny>11)zaciatocny-=11; else zaciatocny=0; posun=1; } else aktualny++; break; case DOWN:if(++aktualny>=33) if(aktualny+zaciatocny=pocet_riadkov)aktualny--; break; case LEFT:if(aktualny>10)aktualny-=11;break; case RIGHT:if(aktualny<22 && zaciatocny+aktualny+11=pocet_riadkov) aktualny=pocet_riadkov-zaciatocny-1; break; } } } } } //************************************************************************// // ZOBRAZ_AKTUALNY_ADRESAR zobrazi aktualny adresar // // 30.10.1997 // //************************************************************************// void zobraz_aktualny_adresar(int zx,int zy,char *meno) { char cesta[256]; char pom[256]; struct Adresar *adresar; register int i=0; adresar=farmalloc(512 * sizeof(struct Adresar)); pamet(); if(adresar == NULL) { error(3); return; } for(i=5;i<16;i++) tlac_retazec(zx+2,zy+i,atributy[15]," ³ ³ "); strcpy(cesta,"a:\\"); cesta[0]=getdisk()+'A'; getcurdir(0,pom); strcat(cesta,pom); strcat(cesta,"\\"); i=vypln_adresar(meno,cesta,adresar); tlac_adresar(zx,zy,0,i,adresar); if(strlen(cesta)>44) { tlac_retazec(zx+2,zy+18,atributy[14],&cesta[strlen(cesta)-45]); tlac_znak(zx+2,zy+18,atributy[14],17); } else { tlac_retazec(zx+2,zy+18,atributy[14],cesta); for(i=strlen(cesta);i<44;i++) tlac_znak(zx+2+i,zy+18,atributy[14],' '); } farfree(adresar); pamet(); } //************************************************************************// // VYPLN_ADRESAR // // 30.10.1997 // //************************************************************************// int vypln_adresar(char *meno,char *cesta,struct Adresar *adresar) { char pom[100]; char *p; register int i=0,koniec=0; struct ffblk ffblk; strcpy(pom,cesta); strcat(pom,"*"); koniec=findfirst(pom,&ffblk,FA_DIREC); if(chyba_hard) { chybove_okno(chyba[0]); return 0; } if(strcmp(ffblk.ff_name,".")==0) koniec=findnext(&ffblk); while(!koniec) { if(chyba_hard) { chybove_okno(chyba[0]); return 0; } if(ffblk.ff_attrib==FA_DIREC) { adresar[i].typ=DIRECTORY; vytvor_riadok(adresar[i].meno,adresar[i].konc,ffblk.ff_name); i++; } koniec=findnext(&ffblk); } strcpy(pom,cesta); strcat(pom,meno); koniec=findfirst(pom,&ffblk,FA_ARCH); if(chyba_hard) { chybove_okno(chyba[0]); return 0; } while(!koniec) { if(chyba_hard) { chybove_okno(chyba[0]); return 0; } if(ffblk.ff_attrib==FA_ARCH) { adresar[i].typ=FILENAME; p=ffblk.ff_name; while(*p!='\0') { *p=tolower(*p); p++; } vytvor_riadok(adresar[i].meno,adresar[i].konc,ffblk.ff_name); i++; } koniec=findnext(&ffblk); } return i; } //************************************************************************// // VYTVOR_RIADOK // // 30.10.1997 // //************************************************************************// void vytvor_riadok(char *meno,char *konc,char *nazov) { if(*nazov=='.') strcpy(meno,".. "); else { while(*nazov!='\0' && *nazov!='.') *meno++=*nazov++; *meno='\0'; if(*nazov!='\0') { nazov++; while(*nazov!='\0') *konc++=*nazov++; } *konc='\0'; } } //************************************************************************// // KONTROLUJ_PATH funkcia vygeneruje z path plnu cestu a meno suboru // // funkcia vrati 0 ak treba rozbalit directory // // vrati 1 ak netreba rozbalit directory, ide o konkretny subor // // vrati 2 ak je neplatny adresar // // vrati 3 ak subor sa neda otvorit // // vrati 4 ak hardware chyba // // 30.10.1997 // //************************************************************************// int kontroluj_path(char *path,char *cesta,char *meno) { char drive[5]; char dir[80]; char name[15]; char ext[8]; char pom[100]; struct ffblk ff; unsigned typ; int chyba,i; typ=fnsplit(path,drive,dir,name,ext); if((FILENAME&typ) == 0) /* treba implicitne meno */ { strcpy(name,"*"); typ= typ|WILDCARDS; } if((DRIVE&typ) == 0) /* nie je drive */ { drive[0] = 'A'+ getdisk(); drive[1] = ':'; drive[2] = '\0'; } else drive[0] = toupper(drive[0]); if((DIRECTORY&typ)==0 || dir[0]!='\\') /* ci je popisany adresar - */ { pom[0]='\\'; /* - vylomitkovana cesta */ if(getcurdir(drive[0]-'A'+1,&pom[1]) == -1) /* vrati chybu */ return 4; /* alebo uplne meno cesty, az do */ if(strlen(pom) > 1) /* aktualneho adresara na urcenom */ strcat(pom,"\\"); /* disku */ if((DIRECTORY&typ) != 0) strcat(pom,dir); strcpy(dir,pom); } i=0; while(dir[i] != '\0') { dir[i]=toupper(dir[i]); i++; } strcpy(cesta,drive); strcat(cesta,dir); /* test spravnosti adresara */ strcpy(pom,cesta); strcat(pom,"*"); if(strlen(cesta) > 3) /* koren netreba kontrolovat */ { chyba=findfirst(pom,&ff,FA_DIREC); /* prehladavanie adresara */ if(chyba_hard) /* podla zvolenej masky */ return 4; if(chyba == -1) return 2; } strcpy(meno,name); if((EXTENSION&typ) == 0) strcpy(ext,".*"); strcat(meno,ext); if((WILDCARDS&typ) == 0) { strcpy(pom,cesta); strcat(pom,meno); chyba=findfirst(pom,&ff,FA_ARCH); /* to iste pre subor */ if(chyba_hard) return 4; if(chyba == -1) return 3; return 1; } return 0; } //************************************************************************// // OBDLZNIK // // 30.10.1997 // //************************************************************************// void obdlznik(int zacx,int zacy,int pozicia,unsigned char attr) { register int i,x; x=zacx+2+15*(pozicia/11); for(i=0;i<14;i++) nastav_atribut(x+i,zacy+5+(pozicia%11),attr); } //************************************************************************// // TLAC_ADRESAR // // 30.10.1997 // //************************************************************************// void tlac_adresar(int zacx,int zacy,int zaciatocny,int pocet,struct Adresar *adresar) { register int i,j; for(i=5;i<16;i++) tlac_retazec(zacx+2,zacy+i,atributy[15]," ³ ³ "); j=zaciatocny; for(i=0;i<33;i++) if(j>=pocet)break; else { tlac_retazec(zacx+3+15*(i/11),zacy+5+(i%11),atributy[15],adresar[j].meno); tlac_retazec(zacx+15*(i/11)+12,zacy+5+(i%11),atributy[15],adresar[j].konc); j++; } for(j=i;j<33;j++) tlac_retazec(zacx+3+15*(j/11),zacy+5+(j%11),atributy[15]," "); } /*---------------------------------END--------------------------------------*/