kolibrios/programs/system/shell/cmd/cmd_ls.c
Kirill Lipatov (Leency) 9e91bb1d1c * help now displays the list of commands in three columns
* ps now displays the RAM size used by the process
* ls now displays all files not in one but in several columns, the old single column output is still accessible via the key '-1'

git-svn-id: svn://kolibrios.org@7024 a494cfbc-eb01-0410-851d-a64ba20cac60
2017-09-27 18:44:15 +00:00

110 lines
2.5 KiB
C

int cmd_ls(char dir[])
{
kol_struct70 k70;
unsigned *n;
unsigned num_of_file; // number of files in directory
unsigned *t;
unsigned type_of_file; // check is this a file or a folder
int i, result;
bool single_column_mode = FALSE;
k70.p00 = 1;
k70.p04 = 0;
//k70.p08 = 0;
k70.p12 = 2; // just for test exist & read number of entries
k70.p16 = (unsigned) malloc(32+k70.p12*560);
k70.p20 = 0;
if (!strnicmp(dir,"-1",1))
{
single_column_mode = TRUE;
dir += 3;
}
if ( !strlen(dir) )
k70.p21 = cur_dir;
else
k70.p21 = dir;
result = kol_file_70(&k70);
if ( !((result==0) || (result==6)) ) // check does the directory exists
{
free( (void*) k70.p16);
return FALSE;
}
n = (unsigned*) (k70.p16+8);
num_of_file = *n;
// now read full directory
k70.p12 = num_of_file;
free( (void*) k70.p16);
k70.p16 = (unsigned) malloc(32+k70.p12*560);
if ( !k70.p16 )
return FALSE;
result = kol_file_70(&k70);
if ( !((result==0) || (result==6)) )
{
free( (void*) k70.p16);
return FALSE;
}
// if there was '-1' param, then show single column mode
// otherwise show files in several columns
if (single_column_mode == TRUE)
{
_SINGLE_COLUMN_MODE:
for (i = 0; i < num_of_file; i++)
{
printf (" %s", k70.p16+32+40+(264+40)*i);
t = (unsigned*) (k70.p16+32+(264+40)*i);
type_of_file = *t;
if ( (0x10 == (type_of_file&0x10)) || (8 == (type_of_file&8)) )
printf ("/");
printf ("\n\r");
}
}
else
{
int longest_name_len = 0;
int console_window_width = 78; //need to get this value from console.obj if it's possible
for (i = 0; i < num_of_file; i++)
{
int current_name_len;
current_name_len = strlen( (char*)k70.p16+32+40+(264+40)*i);
if (current_name_len > longest_name_len) longest_name_len = current_name_len;
}
longest_name_len+=2; //consider space separator and '/' symbol for folders
int columns_max = console_window_width / longest_name_len;
if (longest_name_len >= console_window_width) goto _SINGLE_COLUMN_MODE; //there was too long filename
for (i = 0; i < num_of_file; i++)
{
char cur_file[2048];
strncpy(cur_file, (char*)k70.p16+32+40+(304)*i, sizeof(cur_file)-2);
t = (unsigned*) (k70.p16+32+(304)*i);
type_of_file = *t;
if ( (0x10 == (type_of_file&0x10)) || (8 == (type_of_file&8)) ) strcat(cur_file, "/");
printf ("%*s", -longest_name_len, cur_file);
if ((i>0) && ((i+1)%columns_max == 0)) printf ("\n\r");
}
if ((i)%columns_max != 0) printf("\n\r");
}
free((void*)k70.p16);
return TRUE;
}