/***************************************************************************/
// "Меркурий"-"Правда" - open source переводчик
// распространяется в соответсвии с лицензией GNU v 2.0
//
// ЛАЗАЛКА ПО ДИСКУ
// Анисимов Д.В. сегодня
/***************************************************************************/
# include <time.h>
# include <dirent.h>
# ifdef __WIN__
# include <dir.h>
#else
# include <unistd.h>
#endif
# include <sys/types.h>
# include <sys/stat.h>
# include <errno.h>
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
# 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 ) ;
statistik( ) ;
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 ; i<l ; i++ )
if( str[i]=='.' ){ p=i ; break ; }
if( p>8 || l-p>4 ) goto M1 ;
for( i=0 ; i<p ; i++ )
{ c=str[i] ;
if( ('!'<=c && c<='&') || ('0'<=c && c<='9')
|| ('?'<=c && c<='Z') || ('a'<=c && c<='z')
|| c=='*' || c=='_' ) ;
else goto M1 ;
}
for( i=p+1 ; i<l ; i++ )
{ c=str[i] ;
if( ('!'<=c && c<='&') || ('0'<=c && c<='9')
|| ('?'<=c && c<='Z') || ('a'<=c && c<='z')
|| c=='*' || c=='_' ) ;
else goto M1 ;
}
return 0 ;
M1:
return -1 ;
}
/* ----------------------------------------------------------------------- */
short t_Dir :: in_file( void )
{ short i ;
static short taste1,taste2 ;
char Path1[100] ;
strcpy( Path1,Path ) ;
read_file( Path ) ;
for( i=2 ; i<n_Line-5 ; i++ )
s_text_yxf( File_Line+i,File_Pos,dir_file_Color,emptystr(49) );
Begin=i_File=0 ;
while( 1 )
{ paint_file( 0 ) ;
s_getch( &taste1,&taste2 );
switch( taste1 )
{ case 0 :
switch( taste2 )
{ case S_key_Down : i_File++ ; break ;
case S_key_Up : i_File-- ; break ;
case S_key_PgUp : i_File-=n_Line-8 ; break ;
case S_key_PgDn : i_File+=n_Line-8 ; break ;
case S_key_Home : i_File=0 ; break ;
case S_key_End : i_File=n_File-1 ; break ;
case S_key_F3 : paint_file( 1 ) ; return 3 ;
case S_key_F4 : paint_file( 1 ) ; return 4 ;
case S_key_F10 : return -1 ;
}
if( i_File<0 ) i_File=0 ;
if( i_File<Begin ) Begin=i_File ;
if( i_File>=n_File ) i_File=n_File-1 ;
if( Begin+n_Line-8<i_File ) Begin=i_File-(n_Line-8) ;
break ;
case '\r' :
if( File[i_File].type==0 ) return 0 ;
else
{ if( 0==strcmp( File[i_File].name,".." ) )
{ for( i=strlen( Path )-2 ; 0<=i ; i-- )
if( Path[i]==SLASH ){ Path[i+1]=0 ; break ; }
}
else
{ strcat( Path,File[i_File].name ); strcat( Path,SLASH1 ); }
read_file( Path ) ;
Begin=i_File=0 ;
}
for( i=2 ; i<n_Line-5 ; i++ )
s_text_yxf( File_Line+i,File_Pos,dir_file_Color,emptystr(49) );
break ;
}
}
}
/* ----------------------------------------------------------------------- */
void t_Dir :: karkas( char fsave )
{
s_nacht();
s_rame2_F( 1, 0, 3, 79, dir_rame_Color );
s_rame2_F( 4, 51, 6, 79, dir_rame_Color );
s_rame2_F( 7, 51, 9, 79, dir_rame_Color );
s_rame2_F(10, 51,12, 79, dir_rame_Color );
s_rame2_F( 4, 0, n_Line-1, 50, dir_rame_Color );
if( fsave==0 ) s_text_yxf( 0,30,0x0f,"Прочесть файл");
else s_text_yxf( 0,30,0x0f,"Записать файл как");
s_text_yxf( 1, 4,titl_Color,"Полный путь (path):" );
s_text_yxf( 4,56,taste_Color,"F2 "); s_text_yxf( 3,59,titl_Color,"диски" );
s_text_yxf( 7,56,taste_Color,"F3 "); s_text_yxf( 6,59,titl_Color,"шаблон" );
s_text_yxf(10,56,taste_Color,"F4 "); s_text_yxf( 9,59,titl_Color,"новый файл" );
s_text_yxf( 4, 9,titl_Color," файлы и каталоги " );
s_text_yxf( 5, 3,titlchen_Color,"имя дата время размер" );
s_text_yxf( 6, 3,dir_rame_Color,"---------------------------------------------" );
}
/***************************************************************************/
void t_Dir :: help( void )
{ short y=20,x=51 ;
s_rame1_F(y,x,y+5,x+28,dir_rame_Color) ;
s_text_yxf(y+1,x+2,dir_rame_Color,"Боже, Боже!");
s_text_yxf(y+2,x+2,dir_rame_Color,"дай мне полчаса времени");
s_text_yxf(y+3,x+2,dir_rame_Color,"source - код вселенной");
s_text_yxf(y+4,x+2,dir_rame_Color,"и хороший отладчик...");
}
/* ----------------------------------------------------------------------- */
void t_Dir :: statistik( void )
{
short y=13,x=51 ;
s_rame1_F (y,x,y+6,x+28,dir_rame_Color) ;
s_text_yxf(y ,x+2,titl_Color," Статистика ") ;
s_text_yxf(y+1,x+1,dir_rame_Color," Открытых файлов ");
s_text_yxf(y+2,x+1,dir_rame_Color," Их общая длина ");
s_text_yxf(y+3,x+1,dir_rame_Color," Их исходная длина ");
s_text_yxf(y+4,x+1,dir_rame_Color," Инкремент длинны ");
s_text_yxf(y+5,x+1,dir_rame_Color," Св. места на диске");
}
/* ----------------------------------------------------------------------- */
void t_Dir :: paint_file( char Mode )
{ char f,str[32],str1[50] ;
short i,i1,s1 ;
s_text_yxf( Line_Path,Pos_Path,path_Color,emptystr(40) ) ;
s_text_yxf( Line_Path,Pos_Path,path_Color,Path ) ;
for( i=Begin ; i<min(Begin+n_Line-7,n_File) ; i++ )
{ if( i==i_File && Mode==0 ) f=cur_dir_Color ; else f=dir_file_Color ;
file_date( str, File[i] ) ;
s1=File_Line+i+2-Begin ;
strcpy( str1,emptystr(49) ) ;
for( i1=0 ; i1<15 ; i1++ )
{ if( File[i].name[i1]==0 ) break ;
str1[i1]=File[i].name[i1] ;
}
for( i1=0 ; i1<23 ; i1++ )
str1[26+i1]=str[i1] ;
s_text_yxf( s1,File_Pos,f,str1 ) ;
}
}
/* ----------------------------------------------------------------------- */
char t_Dir :: read_file( char *path )
{
short j ;
char path1[100] ;
DIR *my_dir ;
struct dirent *ent ;
static struct stat stat1 ;
my_dir = opendir( path );
if( my_dir==NULL ) return 0 ;
j=0 ;
while( 1 )
{
ent = readdir( my_dir ) ;
if( ent == NULL ) break ;
strcpy(path1,path); strcat(path1,SLASH1); strcat(path1,ent->d_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( &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,"<Dir>",5 ) ;
}
/* ----------------------------------------------------------------------- */
void t_Dir :: sort_file( void )
{ struct t_File1 Buf ;
short i,j ;
char f1,f2,f3,f4,t,t1 ;
for( j=0 ; j<n_File ; j++ )
for( i=1 ; i<n_File ; i++ )
{ t=File[i].type ; t1=File[i-1].type ;
f1 = t==1 && t1==0 ;
f2 = t==0 && t1==0 ;
f3 = t==1 && t1==1 ;
f4 = 0>strcmp( 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 ;
}