/***************************************************************************/ // "Меркурий"-"Правда" - open source переводчик // распространяется в соответсвии с лицензией GNU v 2.0 // // ЛАЗАЛКА ПО ДИСКУ // Анисимов Д.В. сегодня /***************************************************************************/ # include # include # ifdef __WIN__ # include #else # include #endif # include # include # include # include # include # include # include "mylib.h" # include "dir1.h" # include "color.h" # include "video.h" # include "window.h" # ifdef __WIN__ #define SLASH '\\' #define SLASH1 "\\" # else #define SLASH '/' #define SLASH1 "/" # endif # define LENGTH_DIR 500 # ifndef __WIN__ e_WinMsg kommand_yxf( short y, short x, char f, char *str, short lenght, char EIN, char **str1=NULL, short n_str1=0 ); # endif char schablon( char *s, char *n ); char name_test( char *str ); void name_zerstoren( char *sou, char *dst1, char *dst2 ); char schablon1( char *s, char *n); static short File_Line=5, File_Pos=1, Line_Path=2, Pos_Path=3 ; /* *********************************************************************** */ /***************************************************************************/ short t_Dir :: direktor( char *Antwort, char fsave ) { short reg ; static char f=0 ; Antwort[0]=0 ; if( f==0 ) { File=(t_File1 *)Calloc( 500, sizeof(t_File1) ); strcpy( shabl,"*.*" ) ; } karkas( fsave ) ; if( f==0 ) { getcwd( Path,100 ); if( SLASH!=Path[strlen(Path)-1] ) strcat( Path,SLASH1 ); } f=1 ; paint_schabl( ); reg=5 ; /* -------------------------------- цикл работы ---- */ while( 1 ) { help( ) ; switch( reg ) { case 3 : in_schabl( ); reg=5 ; break ; case 4 : if( 1==in_name( ) ) { strcpy( Antwort,Path ); strcat( Antwort,Name ) ; goto Ausgang ; } reg=5 ; break ; case 5 : reg=in_file( ); if( reg== -1 ) goto Ausgang ; if( reg==0 ) { strcpy( Antwort,Path ); strcat( Antwort,File[i_File].name ) ; goto Ausgang ; } break ; default : reg=5 ; } } Ausgang : s_nacht( ) ; return reg ; } /* ----------------------------------------------------------------------- */ void t_Dir :: set_schabl( char *str ) { strcpy( shabl,str ) ; } /* ----------------------------------------------------------------------- */ void t_Dir :: get_schabl( char *str ) { strcpy( str,shabl ) ; } /* ----------------------------------------------------------------------- */ void t_Dir :: in_schabl( void ) { char str[32] ; strcpy( str,shabl ) ; kommand_yxf( 8,52,schabl_Color,str,26,0 ) ; if( 0==name_test( str ) ) strcpy( shabl,str ); s_text_yxf( 8,52,schabl_Color,emptystr(26) ) ; paint_schabl( ) ; } /* ----------------------------------------------------------------------- */ void t_Dir :: paint_schabl( void ) { short l ; l=strlen(shabl) ; s_text_yxf1( 8,52 ,dir_file_Color,shabl ) ; s_text_yxf( 8,54+l,dir_file_Color,emptystr(24-l) ) ; } /* ----------------------------------------------------------------------- */ short t_Dir :: in_name( void ) { char str[32] ; str[0]=0 ; kommand_yxf( 11,52,schabl_Color,str,26,0 ) ; if( str[0]==0 ) goto M1 ; if( 0==name_test( str ) ) { strcpy( Name,str ) ; return 1 ; } M1 : s_text_yxf( 11,52,dir_rame_Color,emptystr(26) ) ; return 0 ; } /* ----------------------------------------------------------------------- */ char name_test( char *str ) { short i,p,l ; char c ; p=l=strlen( str ) ; if( l>12 ) goto M1 ; for( i=0 ; i8 || l-p>4 ) goto M1 ; for( i=0 ; i

=n_File ) i_File=n_File-1 ; if( Begin+n_Line-8access(Path1,X_OK) ) break ; strcat( Path,File[i_File].name ); strcat( Path,SLASH1 ); } read_file( Path ) ; Begin=i_File=0 ; } for( i=2 ; id_name); stat( path1,&stat1 ) ; if( 0==(S_IFDIR&stat1.st_mode) ) { if( 0==schablon( shabl,ent->d_name) ) continue ; strcpy( File[j].name,ent->d_name ) ; File[j].type=0 ; File[j].date=stat1.st_mtime ; File[j].size=stat1.st_size ; j++ ; } else { if( 0==strcmp( ent->d_name,".") ) continue ; strcpy( File[j].name,ent->d_name ) ; File[j].type=1 ; j++ ; } } closedir( my_dir ) ; n_File=j ; sort_file( ); return 0 ; } /* ----------------------------------------------------------------------- */ void t_Dir :: file_date( char *antwort, struct t_File1 &file ) { short uhr,minut, tag,monate,jahr ; long size ; short i,i1,j ; char c[10] ; struct tm *tm1 = localtime( (const time_t*)&file.date ); minut = tm1->tm_min ; uhr = tm1->tm_hour ; tag = tm1->tm_mday ; monate = tm1->tm_mon ; jahr = tm1->tm_year ; size = file.size ; strcpy( antwort,"00:00:00 00:00 " ) ; sprintf( c,"%d",tag ); for( i=0 ; c[i]!=0 ; i++ ) ; for( j=2-i,i1=0 ; c[i1]!=0 ; i1++ ) antwort[j+i1]=c[i1] ; sprintf( c,"%d",1+monate ); for( i=0 ; c[i]!=0 ; i++ ) ; for( j=5-i,i1=0 ; c[i1]!=0 ; i1++ ) antwort[j+i1]=c[i1] ; sprintf( c,"%d",jahr%100 ); for( i=0 ; c[i]!=0 ; i++ ) ; for( j=8-i,i1=0 ; c[i1]!=0 ; i1++ ) antwort[j+i1]=c[i1] ; sprintf( c,"%d",uhr ); for( i=0 ; c[i]!=0 ; i++ ) ; for( j=12-i,i1=0 ; c[i1]!=0 ; i1++ ) antwort[j+i1]=c[i1] ; sprintf( c,"%d",minut ); for( i=0 ; c[i]!=0 ; i++ ) ; for( j=15-i,i1=0 ; c[i1]!=0 ; i1++ ) antwort[j+i1]=c[i1] ; if( file.type==0 ) { sprintf( c,"%ld",size ); for( i=0 ; c[i]!=0 ; i++ ) ; for( j=23-i,i1=0 ; c[i1]!=0 ; i1++ ) antwort[j+i1]=c[i1] ; } else strncpy( antwort+18,"

",5 ) ; } /* ----------------------------------------------------------------------- */ void t_Dir :: sort_file( void ) { struct t_File1 Buf ; short i,j ; char f1,f2,f3,f4,t,t1 ; for( j=0 ; jstrcmp( File[i].name,File[i-1].name ) ; if( f1 || (f2 && f4) || (f3 && f4) ) { Buf=File[i] ; File[i]=File[i-1] ; File[i-1]=Buf ; } } } /* ----------------------------------------------------------------------- */ char schablon( char *s, char *n ) { char s1[32],s2[32] ; char n1[32],n2[32] ; char f ; name_zerstoren( s,s1,s2 ); name_zerstoren( n,n1,n2 ); f=schablon1(s1,n1) & schablon1(s2,n2) ; return f ; } /* ----------------------------------------------------------------------- */ void name_zerstoren( char *sou, char *dst1, char *dst2 ) { short n,i,p,f ; n=strlen(sou); for( f=0,i=n-1 ; 0<=i ; i-- ) if( sou[i]=='.'){ f=1 ; p=i ; break ; } if( f==1 ) { strcpy( dst1,sou ); dst1[p]=0 ; strcpy( dst2,sou+p+1 ); } else { strcpy(dst1,sou); dst2[0]=0 ; } } /* ----------------------------------------------------------------------- */ char schablon1( char *s, char *n) { short i,f ; if( s[0]=='*' ) return 1 ; for( i=0 ; i<32 ; i++ ) { if( s[i]!='?' && s[i]!=n[i] ) { f=0 ; break ; } if( s[i]==0 ) { f=1 ; break ; } } return f ; }