• 软件测试技术
  • 软件测试博客
  • 软件测试视频
  • 开源软件测试技术
  • 软件测试论坛
  • 软件测试沙龙
  • 软件测试资料下载
  • 软件测试杂志
  • 软件测试人才招聘
    暂时没有公告

字号: | 推荐给好友 上一篇 | 下一篇

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

发布: 2007-6-08 22:43 | 作者: seanhe | 来源: | 查看: 59次 | 进入软件测试论坛讨论

领测软件测试网
/*#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/


关于领测软件测试网 | 领测软件测试网合作伙伴 | 广告服务 | 投稿指南 | 联系我们 | 网站地图 | 友情链接
版权所有(C) 2003-2010 TestAge(领测软件测试网)|领测国际科技(北京)有限公司|软件测试工程师培训网 All Rights Reserved
北京市海淀区中关村南大街9号北京理工科技大厦1402室 京ICP备10010545号-5
技术支持和业务联系:info@testage.com.cn 电话:010-51297073

软件测试 | 领测国际ISTQBISTQB官网TMMiTMMi认证国际软件测试工程师认证领测软件测试网