Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 1664 → Rev 1665

/programs/system/shell/modules/module_command.c
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);
 
}
 
/// ===========================================================