/*#Newsh.c 源程序清单*/
#include<termio.h>
#include<signal.h>
#define ESCAP 27 /* 功能键引导符*/
/* 应根据所用设备及工作需要,
修改以下各值,
请参考你的有关手册. */
/* 以下4行为主机键盘功能键的值:*/
#define CF1 77 /* F1键 */
#define CF2 78 /* F2键 */
#define CF3 79 /* F3键 */
#define CF4 80 /* F4键 */
/*以下4行为终端键盘功能键的值: */
#define PF1 80 /* PF1键 */
#define PF2 81 /* PF2键 */
#define PF3 82 /* PF3键 */
#define PF4 83 /* PF4键 */
/*以下4行为终端键盘功能键的值: */
#define AF1 32 /* Alt+F1键*/
#define AF2 33 /* Alt+F2键*/
#define AF3 34 /* Alt+F3键*/
#define AF4 35 /* Alt+F4键*/
/*以下4行为终端键盘功能键的值: */
#define TF1 77 /* F1键 */
#define TF2 78 /* F2键 */
#define TF3 79 /* F3键 */
#define TF4 80 /* F4键 */
#define ABORT 68 /* 放弃键 */
#define INSERT 65 /* 插入键 */
#define LENGTH 100 /* 命令行长度 */
#define LF 10 /* 换行符 */
#define BACKSP 8 /* 退格符 */
#define QUIT 4 /*退出键Ctrl+d*/
#define PROMT0 "# " /* 提示符 */
#define PROMT1 "$ " /* 提示符 */
#define ERROR "error,bad directory\n"
#define MESS "\n\nEnter terminal flag: "
char buff[LENGTH*2];
char *str1=buff;
char *str2=buff+LENGTH;
char *ii,*jj,*tmp;
char chr,flag0,flag1,flag2;
char f1,f2,f3,f4;
main(argc,argv)
int argc;
char *argv[];
{ /* main */
struct termio tdes;
char *getenv(char*);
char *ttyname(int);
char *pt;
tmp=ttyname(0);
for( ;*tmp;tmp++);
if (flag1=(*(--tmp)<'A')) {
f1=CF1;
f2=CF2;
f3=CF3;
f4=CF4;
}
else { /* else 0 */
if (argc==1){
write(1,MESS,23);
read(0,&flag2,1);
} else
flag2=*argv[1];
switch (flag2) { /*switch*/
case '0':
f1=TF1;
f2=TF2;
f3=TF3;
f4=TF4;
break;
case '1':
f1=PF1;
f2=PF2;
f3=PF3;
f4=PF4;
break;
case '2':
default:
f1=AF1;
f2=AF2;
f3=AF3;
f4=AF4;
break;
} /*switch*/
} /* else 0 */
if(!(pt=getenv("PS1")))
pt=getuid()?PROMT1:PROMT0;
do { /* do while 1 */
ioctl(0,TCGETA,&tdes);
tdes.c_lflag &=~ECHO;
tdes.c_lflag &=~ICANON;
tdes.c_cc[VMIN]=1;
tdes.c_cc[VTIME]=0;
ioctl(0,TCSETA,&tdes);
signal(SIGINT,SIG_IGN);
ii=str2; str2=str1;
str1=ii; jj=str2;
flag0=1;
write(1,pt,2);
do { /* do while2 */
read(0,&chr,1);
switch(chr)
{ /*switch1*/
case ESCAP:
funkey();
break;
case BACKSP:
if (ii>str1) {
ii--;
if (jj>str2)
jj--;
write(1,"\b \b",3);
}
break;
default:
*ii++=chr;
write(1,&chr,1);
if (flag0) jj++;
} /* switch 1 */
} /* do while2 */
while (chr!=LF && chr!=QUIT);
for (--ii;*ii;*ii++=0) ;
tdes.c_lflag |=ECHO;
tdes.c_lflag |=ICANON;
tdes.c_cc[VMIN]=4;
ioctl(0,TCSETA,&tdes);
signal(SIGINT,SIG_DFL);
tmp=str1;
for(;*tmp==' ';tmp++);
if (*tmp++=='c' && *tmp++=='d'
&& (*tmp==' ' || *tmp==0))
{
for(;*tmp==' ';tmp++);
if (!*tmp)
tmp=getenv("HOME");
if (chdir(tmp))
write(1,ERROR,20);
continue;
}
system(str1); /*执行用户命令*/
} while(chr!=QUIT); /*dowhlie1*/
} /* main */
funkey()
{ /* funkey */
read(0,&chr,1);
if (flag1 || (flag2=='1'))
read(0,&chr,1);
if (chr==f1) {
if (*jj) {
write(1,jj,1);
*ii++=*jj++;
}
return(0);
}
if (chr==f2) {
if(finchr())
do {
write(1,jj,1);
*ii++=*jj++;
}
while(jj<tmp);
return(0);
}
if (chr==f3) {
while ( *jj ) {
write(1,jj,1);
*ii++=*jj++;
}
return(0);
}
if (chr==f4) {
if(finchr()) jj=tmp;
return(0);
}
if (!flag1 && !(flag2=='1'))
read(0,&chr,1);
if (chr==ABORT) {
ii=str1; jj=str2;
write(1,"\\\n ",4);
return(0);
}
if (chr==INSERT)
flag0 ^= 1;
return(0);
} /* funkey */
finchr()
{
read(0,&chr,1);
tmp=jj;
do tmp++;
while (*tmp && *tmp!=chr);
return(*tmp);
}
/*#end*/
【发表回复】【查看CU论坛原帖】【添加到收藏夹】【关闭】
jxp2002 回复于:2004-01-13 10:01:12 |
法王,这个程序什么意思,能否讲清楚点 |
延伸阅读
文章来源于领测软件测试网 https://www.ltesting.net/