forked from KolibriOS/kolibrios
Shell 0.4.4 (All)
git-svn-id: svn://kolibrios.org@1665 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
@@ -0,0 +1,126 @@
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
int alias_check(char alias[])
|
||||
{
|
||||
|
||||
unsigned i;
|
||||
char buf1[256];
|
||||
char buf2[256];
|
||||
|
||||
if ( !alias_split (alias, buf1, buf2))
|
||||
return FALSE;
|
||||
|
||||
|
||||
for (i = 0; i < NUM_OF_CMD; i++)
|
||||
if ( !strcmp(COMMANDS[i].name, buf1) )
|
||||
return -1;
|
||||
|
||||
if (NULL == ALIASES)
|
||||
return FALSE;
|
||||
|
||||
for (i = 0; i < ALIAS_NUM; i++)
|
||||
{
|
||||
if ( !strcmp(ALIASES+256*i, buf1) )
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
int alias_search(char alias[])
|
||||
{
|
||||
|
||||
unsigned i;
|
||||
|
||||
for (i = 0; i < ALIAS_NUM; i++)
|
||||
{
|
||||
if ( !strcmp(ALIASES+256*i, alias) )
|
||||
return i;
|
||||
}
|
||||
|
||||
return -1;
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
int alias_add(char alias[])
|
||||
{
|
||||
|
||||
char buf1[256];
|
||||
char buf2[256];
|
||||
|
||||
if ( ALIAS_NUM > 255)
|
||||
return FALSE;
|
||||
|
||||
if ( !alias_split (alias, buf1, buf2))
|
||||
return FALSE;
|
||||
|
||||
strcpy (ALIASES+256*ALIAS_NUM, buf1);
|
||||
strcpy (ALIASES+256*ALIAS_NUM+64*1024, buf2);
|
||||
ALIAS_NUM++;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
void alias_list()
|
||||
{
|
||||
|
||||
unsigned i;
|
||||
|
||||
if ( 0 == ALIAS_NUM)
|
||||
return;
|
||||
|
||||
for (i = 0; i < ALIAS_NUM; i++)
|
||||
printf (" %s=%s\n\r",ALIASES+256*i, ALIASES+256*i+64*1024);
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
int alias_split (char alias[], char s1[], char s2[])
|
||||
{
|
||||
|
||||
unsigned i, j;
|
||||
|
||||
if (NULL == strchr(alias, '='))
|
||||
return FALSE;
|
||||
|
||||
for (i=0, j = 0;; i++)
|
||||
{
|
||||
if ('=' == alias[i])
|
||||
{
|
||||
s1[i]='\0';
|
||||
break;
|
||||
}
|
||||
s1[i]=alias[i];
|
||||
}
|
||||
|
||||
j = 0;
|
||||
|
||||
for (;; i++, j++)
|
||||
{
|
||||
s2[j]=alias[i];
|
||||
if ('\0' == alias[i])
|
||||
break;
|
||||
}
|
||||
|
||||
trim(s1);
|
||||
|
||||
for (i=0;;i++)
|
||||
{
|
||||
s2[i] = s2[i+1];
|
||||
if ('\0' == s2[i] )
|
||||
break;
|
||||
}
|
||||
|
||||
trim(s2);
|
||||
|
||||
return TRUE;
|
||||
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
@@ -0,0 +1,203 @@
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
void command_clear()
|
||||
{
|
||||
for (;CMD_POS;CMD_POS--)
|
||||
printf("%c %c", 8, 8);
|
||||
CMD[0]='\0';
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
void command_history_add(char command[])
|
||||
{
|
||||
|
||||
if ( (0 != strcmp( CMD_HISTORY[0], CMD)) &&
|
||||
(0 != strcmp( CMD_HISTORY[1], CMD)) &&
|
||||
(0 != strcmp( CMD_HISTORY[2], CMD)) &&
|
||||
(0 != strcmp( CMD_HISTORY[3], CMD)) &&
|
||||
(0 != strcmp( CMD_HISTORY[4], CMD)) )
|
||||
|
||||
{
|
||||
strcpy(CMD_HISTORY[4], CMD_HISTORY[3]);
|
||||
strcpy(CMD_HISTORY[3], CMD_HISTORY[2]);
|
||||
strcpy(CMD_HISTORY[2], CMD_HISTORY[1]);
|
||||
strcpy(CMD_HISTORY[1], CMD_HISTORY[0]);
|
||||
|
||||
strcpy(CMD_HISTORY[0], CMD);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
void command_get()
|
||||
{
|
||||
unsigned key;
|
||||
//unsigned pos = 0;
|
||||
int hist;
|
||||
|
||||
CMD_POS = 0;
|
||||
CMD_NUM = 0;
|
||||
|
||||
for (;;)
|
||||
{
|
||||
key = getch();
|
||||
if ( 0 != (key & 0xff) )
|
||||
{
|
||||
key &= 0xff;
|
||||
switch (key)
|
||||
{
|
||||
case 27: // ESC
|
||||
command_clear();
|
||||
break;
|
||||
|
||||
case 13: // ENTER
|
||||
CMD[CMD_POS] = '\0';
|
||||
printf("\n\r");
|
||||
|
||||
command_history_add(CMD);
|
||||
return;
|
||||
|
||||
case 8: // BACKSPACE
|
||||
if (CMD_POS > 0)
|
||||
{
|
||||
printf ("%c %c", 8, 8);
|
||||
CMD_POS--;
|
||||
}
|
||||
break;
|
||||
|
||||
case 9: // TAB
|
||||
break;
|
||||
|
||||
default:
|
||||
if (CMD_POS < 255)
|
||||
{
|
||||
CMD[CMD_POS] = key;
|
||||
CMD_POS++;
|
||||
printf("%c", key);
|
||||
}
|
||||
break;
|
||||
};
|
||||
}
|
||||
else // îáðàáîòêà ðàñøèðåííûõ êëàâèø
|
||||
{
|
||||
key = (key>>8)&0xff;
|
||||
// printf ("%d\n\r", key);
|
||||
|
||||
switch (key)
|
||||
{
|
||||
|
||||
case 72: // UP
|
||||
for (hist = 0; hist < CMD_HISTORY_NUM; hist++)
|
||||
{
|
||||
command_clear();
|
||||
|
||||
if (CMD_NUM < CMD_HISTORY_NUM-1)
|
||||
CMD_NUM++;
|
||||
else
|
||||
CMD_NUM = 0;
|
||||
|
||||
printf( CMD_HISTORY[CMD_NUM] );
|
||||
strcpy(CMD, CMD_HISTORY[CMD_NUM]);
|
||||
if ((CMD_POS = strlen(CMD)) != 0)
|
||||
break;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case 80: // DOWN
|
||||
for (hist = 0; hist < CMD_HISTORY_NUM; hist++)
|
||||
{
|
||||
command_clear();
|
||||
|
||||
if (CMD_NUM > 0)
|
||||
CMD_NUM--;
|
||||
else
|
||||
CMD_NUM = CMD_HISTORY_NUM-1;
|
||||
|
||||
printf( CMD_HISTORY[CMD_NUM] );
|
||||
strcpy(CMD, CMD_HISTORY[CMD_NUM]);
|
||||
if ((CMD_POS = strlen(CMD)) != 0)
|
||||
break;
|
||||
}
|
||||
break;
|
||||
|
||||
case 0: // console window closed
|
||||
cmd_exit(NULL);
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
int command_get_cmd(char cmd[])
|
||||
{
|
||||
unsigned i;
|
||||
for (i=0;;i++)
|
||||
{
|
||||
cmd[i] = CMD[i];
|
||||
if (0 == cmd[i])
|
||||
{
|
||||
i = -2;
|
||||
break;
|
||||
}
|
||||
if ( iswhite(cmd[i]) )
|
||||
{
|
||||
cmd[i] = '\0';
|
||||
break;
|
||||
}
|
||||
}
|
||||
return i+1;
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
typedef void (*handler1_t)(char* arg);
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
void command_execute()
|
||||
{
|
||||
char cmd[256];
|
||||
char args[256];
|
||||
unsigned arg;
|
||||
int i;
|
||||
|
||||
trim(CMD);
|
||||
arg = command_get_cmd(cmd);
|
||||
|
||||
if ( !strlen(cmd) )
|
||||
return;
|
||||
|
||||
strcpy(args, CMD+arg);
|
||||
trim(args);
|
||||
|
||||
for (i = 0; i < NUM_OF_CMD; i++)
|
||||
{
|
||||
if (!strcmp(cmd, COMMANDS[i].name))
|
||||
{
|
||||
((handler1_t)COMMANDS[i].handler)(args);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if ( -1 != alias_search(CMD) )
|
||||
{
|
||||
strcpy(CMD, ALIASES+64*1024+256*alias_search(CMD));
|
||||
command_execute();
|
||||
return;
|
||||
}
|
||||
|
||||
executable_run(cmd, args);
|
||||
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
@@ -0,0 +1,60 @@
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
int executable_run(char cmd[], char args[])
|
||||
{
|
||||
|
||||
char exec[256];
|
||||
char error_starting[]={" No such command '%s'.\n\r"};
|
||||
int result;
|
||||
|
||||
if ( '/' == cmd[0]) // åñëè ïóòü àáñîëáòíûé
|
||||
{
|
||||
strcpy(exec, cmd);
|
||||
|
||||
if ( !file_check(exec) ) // ïðîâåðÿåì ñóùåñòâîâàíèå ôàéëà
|
||||
{
|
||||
printf(error_starting, cmd);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
else
|
||||
{
|
||||
strcpy(exec, cur_dir); // ïðîâåðÿåì ôàéë â òåêóùåì êàòàëîãå
|
||||
strcat(exec, cmd);
|
||||
|
||||
if ( !file_check(exec) ) // ïðîâåðÿåì ñóùåñòâîâàíèå ôàéëà
|
||||
{
|
||||
strcpy(exec, "/rd/1/"); // ïðîâåðÿåì ôàéë íà âèðòóàëüíîì äèñêå
|
||||
strcat(exec, cmd);
|
||||
if ( !file_check(exec) ) // ïðîâåðÿåì ñóùåñòâîâàíèå ôàéëà
|
||||
{
|
||||
printf(error_starting, cmd);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if ( script_check(exec) )
|
||||
{
|
||||
return script_run(exec, args);
|
||||
}
|
||||
|
||||
/* çàïóñê ïðîãðàììû */
|
||||
result = program_run(exec, args);
|
||||
if (result > 0)
|
||||
{
|
||||
printf (" '%s' started. PID = %d\n\r", cmd, result);
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
printf(error_starting, cmd);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
@@ -0,0 +1,16 @@
|
||||
|
||||
int program_run(char cmd[], char param[])
|
||||
{
|
||||
|
||||
kol_struct70 k70;
|
||||
|
||||
k70.p00 = 7;
|
||||
k70.p04 = 0;
|
||||
k70.p08 = param;
|
||||
k70.p12 = 0;
|
||||
k70.p16 = 0;
|
||||
k70.p20 = 0;
|
||||
k70.p21 = cmd;
|
||||
|
||||
return kol_file_70(&k70);
|
||||
}
|
||||
@@ -0,0 +1,102 @@
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
int script_check(char file[])
|
||||
{
|
||||
|
||||
kol_struct70 k70;
|
||||
char buf[4];
|
||||
|
||||
k70.p00 = 0;
|
||||
k70.p04 = 0;
|
||||
k70.p08 = 0;
|
||||
k70.p12 = 4; // ÷èòàòü 4 áàéòà
|
||||
k70.p16 = buf;
|
||||
k70.p20 = 0;
|
||||
k70.p21 = file;
|
||||
|
||||
kol_file_70(&k70);
|
||||
|
||||
if ( !strcmp(buf, script_sign) )
|
||||
return TRUE;
|
||||
else
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
|
||||
int script_run(char exec[], char args[])
|
||||
{
|
||||
|
||||
kol_struct70 k70;
|
||||
kol_struct_BDVK bdvk;
|
||||
unsigned result, filesize, pos, i;
|
||||
char *buf; //áóôåð, êóäà êîïèðóåòñÿ ñêðèïò
|
||||
|
||||
k70.p00 = 5;
|
||||
k70.p04 = k70.p08 = k70.p12 = 0;
|
||||
k70.p16 = &bdvk;
|
||||
k70.p20 = 0;
|
||||
k70.p21 = exec;
|
||||
|
||||
result = kol_file_70(&k70); // ïîëó÷àåì èíôîðìàöèþ î ôàéëå
|
||||
if ( 0 != result )
|
||||
return FALSE;
|
||||
|
||||
filesize = bdvk.p32[0]; // ïîëó÷àåì ðàçìåð ôàéëà
|
||||
|
||||
buf = malloc(filesize+256);
|
||||
if (NULL == buf)
|
||||
return FALSE;
|
||||
|
||||
buf[filesize]=0;
|
||||
|
||||
k70.p00 = 0;
|
||||
k70.p04 = k70.p08 = 0;
|
||||
k70.p12 = filesize;
|
||||
k70.p16 = buf;
|
||||
k70.p20 = 0;
|
||||
k70.p21 = exec;
|
||||
|
||||
result = kol_file_70(&k70); // ñ÷èòûâàåì ôàéë â áóôåð
|
||||
if ( 0 != result )
|
||||
{
|
||||
free(buf);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
pos = 0;
|
||||
|
||||
for (;;) // îáðàáîòêà ñêðèïòà
|
||||
{
|
||||
|
||||
if (pos > filesize)
|
||||
break;
|
||||
|
||||
for (i=0;;i++) // ñ÷èòûâàíèå ñòðîêè
|
||||
{
|
||||
if ((0x0A == buf[pos])||(0x0D == buf[pos])||(0 == buf[pos]))
|
||||
{
|
||||
pos++;
|
||||
CMD[i] = '\0';
|
||||
break;
|
||||
}
|
||||
CMD[i] = buf[pos];
|
||||
pos++;
|
||||
}
|
||||
|
||||
if ( 0 == strlen(CMD) ) // ïóñòàÿ ñòðîêà
|
||||
continue;
|
||||
|
||||
if ('#' == CMD[0]) // êîììåíòàðèé
|
||||
continue;
|
||||
|
||||
command_execute();
|
||||
|
||||
}
|
||||
|
||||
free(buf);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/// ===========================================================
|
||||
Reference in New Issue
Block a user