Exemplo n.º 1
0
Arquivo: main-ls.c Projeto: Crabbit/c
//输出合适格式的数字
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;
}
Exemplo n.º 3
0
Arquivo: main-ls.c Projeto: Crabbit/c
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" );
			}
		}
	}
}