forked from KolibriOS/kolibrios
7805691d08
- fixed definitions - stack locals changed to heap variables (reduced app size) git-svn-id: svn://kolibrios.org@9808 a494cfbc-eb01-0410-851d-a64ba20cac60
128 lines
3.2 KiB
C
128 lines
3.2 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;
|
|
char* tmp = (char*) malloc(FILENAME_MAX);
|
|
|
|
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) ) // if argument is empty, list current directory
|
|
k70.p21 = cur_dir;
|
|
else
|
|
{
|
|
if (dir[0] != '/') // if given directory is relative path, then append cur_dir on left side
|
|
{
|
|
strcpy(tmp, cur_dir);
|
|
if (tmp[strlen(tmp)-1] != '/')
|
|
{
|
|
strcat(tmp, "/"); // add slash
|
|
}
|
|
strcat(tmp, dir);
|
|
k70.p21 = tmp;
|
|
} else // if given directory is an absolute path
|
|
{
|
|
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;
|
|
|
|
int is_folder = 0;
|
|
if ( (0x10 == (type_of_file&0x10)) || (8 == (type_of_file&8)) ) { is_folder = 1; strcat(cur_file, "/"); }
|
|
|
|
if (is_folder) { printf("\033[0;36m"); } // set cyan for folder
|
|
printf ("%*s", -longest_name_len, cur_file);
|
|
if (is_folder) { printf("\033[0m"); } // is had been set, reset
|
|
|
|
if ((i>0) && ((i+1)%columns_max == 0)) printf ("\n\r");
|
|
}
|
|
if ((i)%columns_max != 0) printf("\n\r");
|
|
}
|
|
|
|
free((void*)k70.p16);
|
|
free(tmp);
|
|
return TRUE;
|
|
}
|
|
|