一个SCO UNIX下实现F3行复制功能键的C程序

发表于:2007-06-08来源:作者:点击数: 标签:
/*#Newsh.c源程序清单*/ #includetermio.h #includesignal.h #defineESCAP27/*功能键引导符*/ /*应根据所用设备及工作需要, 修改以下各值, 请参考你的有关手册.*/ /*以下4行为主机键盘功能键的值:*/ #defineCF177/*F1键*/ #defineCF278/*F2键*/ #defineCF379

/*#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_clearcase/" target="_blank" >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
法王,这个程序什么意思,能否讲清楚点

原文转自:http://www.ltesting.net