//输出合适格式的数字 void print_suit_num( int num, int max_length ) { int num_length = 0; if( num != 0 ) num_length = get_num_length( num ); else num_length = 1; for( ; (max_length - num_length) != 0; num_length++ ) printf( " " ); printf( "%d", num ); //最后面补上一个空格 printf( " " ); }
bool is_right_truncable(int n) { int num_length = get_num_length(n, 10); int denominator; while (n > 0) { denominator = pow(10, num_length - 1); num_length--; n %= denominator; if (!is_prime(n) && n > 0) { return false; } } return true; }
void print_result( Fileinfo *file_array, enum Ignore_mode ignore_mode, enum Format format, enum Time_type time_type, bool recursive ) { //通过全局变量count,获得当前目录文件数量. //通过amount控制 int amount; //通过total获得处理的总文件数 int total = 0; //控制linke最大数 unsigned max_link = 1; //获得用户名最长个数 unsigned max_name = 1; //获得组名最长个数 unsigned max_group = 1; //控制size最大数 unsigned max_size = 1; //输出权限的字符串 char str[10]; struct passwd *user_id; struct group *group_id; //获取终端大小 struct winsize ws; //最大可能将屏幕分256栏,用来记录每栏最大宽度 int block_length[256] = {0}; //用来记录一共多少栏 int block_num = 0; //文件名最短检测 int min_name_length = 50; //当前最大总长度 int max_sum_length = 0; //控制实际输出到第几列,而不是用文件数量变量控制 int control_ana = 0; //控制输出空格数量 int space_num = 0; if( ioctl( 0, TIOCGWINSZ, &ws ) != 0 ) fprintf( stderr, "ioctl error.\n" ); ////先处理一遍文件,求出链接数啊等等最大值 for( amount = 0; amount < count; amount++ ) { //要么-a非隐藏,要么隐藏模式+隐藏dot. if( (ignore_mode == IGNORE_MINIMAL) || (ignore_mode == IGNORE_DEFAULT) && (strncmp(file_array[amount].file_name, "..", 1 ) != 0) ) { //处理文件数自加 total++; //求链接数数字长度最大值 max_link = max( get_num_length(file_array[amount].file_nlink), max_link ); //求用户名最长值 user_id = getpwuid( file_array[amount].file_uid ); max_name = max( strlen(user_id->pw_name), max_name ); //求组名最长值 group_id = getgrgid( file_array[amount].file_gid ); max_group = max( strlen(group_id->gr_name), max_group ); //求size最大值 max_size = max( get_num_length(file_array[amount].file_size), max_size ); if( (strlen(file_array[amount].file_name)+2) < min_name_length ) min_name_length = strlen(file_array[amount].file_name)+2; } } //通过屏幕宽度,根据最小文件名长度计算最大分多少列 //printf( "clo = %d, min length = %d.\n", ws.ws_col, min_name_length ); block_num = ws.ws_col / min_name_length; //开始计算分栏 //当文件大于block_length[]中记录时候,block_num - 1 //并重新计算栏宽 //printf( "total %d lie.\n", block_num ); //求出小列宽度,最多列情况下,每一列的最长长度 while( 1 ) { for( amount = 0, control_ana = 0; amount < count; amount++) { if( (ignore_mode == IGNORE_MINIMAL) || (ignore_mode == IGNORE_DEFAULT) && (strncmp(file_array[amount].file_name, "..", 1 ) != 0) ) { //printf( "now exec is %d lie.\n",control_ana%block_num ); if( (strlen( file_array[amount].file_name )+2) > block_length[control_ana%block_num] ) { block_length[control_ana%block_num] = strlen( file_array[amount].file_name ) +2; } //printf( "%d lie -- file %s,lie length is %d.\n", control_ana%block_num, file_array[amount].file_name, block_length[control_ana] ); control_ana++; } } for( amount = 0, max_sum_length = 0; (amount < total) && (amount < block_num); amount++ ) { max_sum_length += block_length[amount]; } if( max_sum_length > ws.ws_col ) block_num--; else break; //printf( "Now block_number is :%d.\n", block_num ); } //printf( "total %d lie.\n", block_num ); printf( "Total %d files.\n", total ); /* printf( "max link is %d.\n", max_link ); printf( "max name is %d.\n", max_name ); printf( "max grop is %d.\n", max_group ); printf( "max size is %d.\n", max_size ); */ //开始显示文件 for( amount = 0; amount < count; amount++ ) { if( (ignore_mode == IGNORE_MINIMAL) || (ignore_mode == IGNORE_DEFAULT) && (strncmp(file_array[amount].file_name, "..", 1 ) != 0) ) { //printf( "file name = %s\n",file_array[amount].file_name ); //长格式输出 if( format == long_format ) { Print_mode( file_array[amount].file_mode, str ); printf( "%-11s", str ); //输出链接数 print_suit_num( file_array[amount].file_nlink, max_link ); //根据uid输出用户名 user_id = getpwuid( file_array[amount].file_uid ); print_suit_char( user_id->pw_name, max_name ); //更具gid输出组名 group_id = getgrgid( file_array[amount].file_gid ); print_suit_char( group_id->gr_name, max_group ); //输出size print_suit_num( file_array[amount].file_size, max_size ); //输出时间 // -u参数,显示的是最后访问时间 if( time_type == time_atime ) print_time( file_array[amount].file_atime ); else print_time( file_array[amount].file_mtime ); //输出文件名 printf( "%s\n", file_array[amount].file_name ); // 默认参数,显示的是最后修改时间 } if( format == default_format ) { for( amount = 0, control_ana = 0; amount < count; amount++ ) { if( (ignore_mode == IGNORE_MINIMAL) || (ignore_mode == IGNORE_DEFAULT) && (strncmp(file_array[amount].file_name, "..", 1 ) != 0) ) { for( space_num = 0; space_num <( block_length[control_ana%block_num] - strlen(file_array[amount].file_name) -2 ); space_num++ ) { printf( " " ); } control_ana++; printf( "%s ", file_array[amount].file_name ); } if( control_ana != 0 && control_ana % block_num == 0 ) printf( "\n" ); } printf( "\n" ); } } } }