kolibrios-fun/programs/system/shell/shell.c

189 lines
3.2 KiB
C
Raw Normal View History

#include "all.h"
/// ===========================================================
int dir_check(char dir[])
/// just checks, if dir[] is really a directory
{
kol_struct70 k70;
int result;
k70.p00 = 1;
k70.p04 = 0;
//k70.p08 = 0;
k70.p12 = 2; // enough to read . & ..
k70.p16 = (unsigned)malloc(32+k70.p12*560);
k70.p20 = 0;
k70.p21 = dir;
result = kol_file_70(&k70);
free((void*)k70.p16);
if ( (0 == result)||(6 == result) ) // 6 is possible ???
return TRUE;
else
return FALSE;
}
/// ===========================================================
void dir_truncate(char dir[])
{
int i;
i = strlen(dir)-1;
for (;;i--)
if ('/' == dir[i])
{
dir[i+1] = 0;
break;
}
}
/// ===========================================================
void get_file_dir_loc(char *filepath, char *dir_path)
{
char *res = strrchr(filepath, '/');
if (res == 0)
{
dir_path = '\0';
return;
}
size_t pos = res - filepath;
strncpy(dir_path, filepath, pos);
dir_path[pos] = '\0';
}
/// ===========================================================
int file_check(char file[])
{
kol_struct70 k70;
int result;
k70.p00 = 0;
k70.p04 = 0;
//k70.p08 = 0;
k70.p12 = 0;
k70.p16 = 0;
k70.p20 = 0;
k70.p21 = file;
result = kol_file_70(&k70);
if (0 == result)
return TRUE;
else
return FALSE;
}
/// ===========================================================
void file_not_found(char file[])
{
#if LANG_ENG
printf (" File '%s' not found.\n\r", file);
#elif LANG_RUS
printf (" <20><><EFBFBD><EFBFBD> '%s' <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.\n\r", file);
#endif
}
/// ===========================================================
int iswhite(char c)
{
return ((' ' == c) || ('\t' == c) || (13 == c) || (10 == c));
}
/// ===========================================================
void trim(char string[])
{
int i, j;
for (i=0; ;i++)
if ( !iswhite(string[i]) )
break;
j = 0;
for (;;i++, j++)
{
string[j] = string[i];
if ('\0' == string[i] )
break;
}
for (i=0; ;i++)
if ('\0' == string[i])
break;
i--;
for (;i>0;--i)
if ( iswhite(string[i]) )
string[i] = '\0';
else
break;
}
/// ===========================================================
void kol_main()
{
NUM_OF_CMD = sizeof(COMMANDS)/sizeof(COMMANDS[0]);
strcpy(title, "SHELL ");
strcat(title, SHELL_VERSION);
CONSOLE_INIT(title);
if (sizeof (kol_struct70) != 25)
{
printf("Invalid struct align kol_struct70, need to fix compile options\n\r");
kol_exit();
}
//strcpy(cur_dir, PATH);
//dir_truncate(cur_dir);
getcwd(cur_dir, sizeof cur_dir);
//printf("curdir %s\n", cur_dir);
con_set_cursor_height(con_get_font_height()-1);
ALIASES = malloc(128*1024);
if (!PARAM || PARAM[0] == 0)
{
strcpy(CMD, PATH);
dir_truncate(CMD);
strcat(CMD, ".shell");
if ( !file_check(CMD) )
strcpy(CMD, "/sys/settings/.shell");
}
else
{
if (PARAM[0] == '/')
{
strcpy(cur_dir, PARAM);
*(strrchr(cur_dir, '/')+1)=0;
}
strcpy(CMD, PARAM);
}
command_execute();
for (;;)
{
//printf("\033[32;1m");
printf ("# ");
//printf("\033[0m");
command_get();
command_execute();
}
_exit(0);
kol_exit();
}
/// ===========================================================