📄 shell.c
字号:
/*****************************************************************************
* shell.c: BIOSBOX Shell实现
*
* Copyright(C) 2007, uCdragon
* All rights reserved.
*
* History
* 2007.03.16 lqm@ucdragon.net
*
******************************************************************************/
#include "def.h"
#include "board.h"
#include "utils.h"
#define MAX_CMD_LEN 30
#define MAX_CMD_HIS 5
#define CTRL_KEY(k) (k+1-'A')
#define ESC_UP_KEY 0x41
#define ESC_DOWN_KEY 0x42
#define ESC_RIGHT_KEY 0x43
#define ESC_LEFT_KEY 0x44
#define ESC_HOME_KEY 0x48
#define ESC_END_KEY 0x4b
#define UP_KEY CTRL_KEY('W')
#define DOWN_KEY CTRL_KEY('S')
#define RIGHT_KEY CTRL_KEY('D')
#define LEFT_KEY CTRL_KEY('A')
#define ENTER_KEY 0x0d
#define BACK_KEY 0x08
#define ESC_KEY 0x1b
#define SPACE_KEY 0x20
//import from command.c
void ExcuteCommand(char * cmd);
void ShowBootInfo(char * board )
{
puts ( "\n ***************************************\n" );
puts ( "* *\n" );
printf( "* BIOSBOX for %8s V1.00 *\n",board );
printf( "* LQM %s %s *\n" , __DATE__ , __TIME__ );
puts ( "* http://www.uCdragon.com *\n" );
puts ( "* *\n" );
puts ( " ***************************************\n\n" );
}
char Escape(char key)
{
switch(key)
{
case ESC_UP_KEY:
return UP_KEY;
case ESC_DOWN_KEY:
return DOWN_KEY;
case ESC_LEFT_KEY:
return LEFT_KEY;
case ESC_RIGHT_KEY:
return RIGHT_KEY;
default:
return 0;
}
}
void ShowNewCmd(int cursor,int len,char * dest,char * src)
{ while(cursor--) putch(BACK_KEY);
cursor = len;
while(cursor--) putch(SPACE_KEY);
while(len--) putch(BACK_KEY);
if(src)
{
puts(src);
while(*src) * dest ++ = * src ++;
}
}
void BeginShell(char * board)
{
char his[MAX_CMD_HIS][MAX_CMD_LEN];
int lens[MAX_CMD_HIS] = {0};
int escaping = 0;
int entry=0;
int etemp=-1;
int modified=0;
int cursor=0;
char key;
int temp;
ShowBootInfo(board);
SecInitBoard();
puts("> ");
while(TRUE)
{ key=getch();
if(escaping )
{
if(key == '[') key = Escape(getch());
escaping = 0;
}
switch(key)
{
case 0:
break;
case ESC_KEY:
escaping = 1;
break;
case ENTER_KEY:
if(lens[entry])
{
his[entry][lens[entry]] = 0;
cursor = 0;
ExcuteCommand(his[entry]);
if(modified)
{
if(++entry == MAX_CMD_HIS) entry = 0;
etemp = entry;
modified = 0;
}
else if(++etemp == MAX_CMD_HIS) etemp = 0;
lens[entry] = 0;
}
puts("\n> ");
break;
case BACK_KEY:
if(cursor > 0)
{
modified = 1;
putch(BACK_KEY);
cursor --;
lens[entry] --;
if(cursor < lens[entry]) {
for(temp =cursor;temp<lens[entry];temp++)
{
his[entry][temp] =his[entry][temp+1];
putch(his[entry][temp]);
}
}
putch(SPACE_KEY);
putch(BACK_KEY);
if(cursor < lens[entry]) {
for(temp =cursor;temp<lens[entry];temp++)
{
putch(BACK_KEY);
}
}
}
break;
case UP_KEY:
temp = etemp-1;
if(temp == -1) temp = MAX_CMD_HIS -1;
if(temp == entry) break;
if(lens[temp] == 0) break;
etemp = temp;
ShowNewCmd(cursor,lens[entry],his[entry],his[etemp]);
modified = 0;
lens[entry] = cursor = lens[etemp];
break;
case DOWN_KEY:
if(etemp == entry) break;
if(++etemp == MAX_CMD_HIS) etemp = 0;
ShowNewCmd(cursor,lens[entry],his[entry],etemp == entry? 0 : his[etemp]);
modified = 0;
cursor = etemp == entry ? 0 : lens[etemp];
lens[entry] = cursor ;
break;
case LEFT_KEY:
if(cursor > 0)
{
cursor --;
putch(BACK_KEY);
}
break;
case RIGHT_KEY:
if(cursor < lens[entry])
{
putch(his[entry][cursor ++]);
}
break;
default:
modified = 1;
if(cursor >= MAX_CMD_LEN-1) break;
if(key < SPACE_KEY) key = SPACE_KEY;
putch(key);
if(cursor < lens[entry])
{
for(temp = lens[entry];temp > cursor;temp--) his[entry][temp] = his[entry][temp-1];
for(temp = cursor+1;temp <= lens[entry];temp++) putch(his[entry][temp]);
for(temp = cursor;temp < lens[entry];temp++) putch(BACK_KEY);
}
his[entry][cursor++] = key;
lens[entry]++;
break;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -