- #include "mycmd.h"
- void my_init();
- void my_destory();
- int main(int argc,char* argv[])
- {
- int ret; //char
- int cmd_show; //cmd what is show
- int cmd_now; //cmd should mark
- int cmd_ptr; //cmd station
- int cmd_ptr_cp;
- int i;
- char my_cmd[100][256];
- char buffer[256]={'\\0'};
- cmd_show = 0;
- cmd_now = 0;
- cmd_ptr = 0;
- cmd_ptr_cp = 0;
- printf("\\n--------------------------------------------------------\\n");
- printf("\\n------------------------- start ------------------------\\n");
- //get char
- while(1)
- {
- ret = getchar();
- //yichu
- if(cmd_ptr == 255)
- {
- printf("\\nbuffer yichu\\n");
- buffer[cmd_ptr] = '\\0';
- printf("%s",buffer);
- }
- //CTRL + D
- if( 4 == ret)
- break;
- //guangbiao move
- if( ret == 27)
- {
- buffer[cmd_ptr] = ret;
- cmd_ptr++;
- ret = getchar();
- if(ret == 91)
- {
- buffer[cmd_ptr] = ret;
- cmd_ptr++;
- ret = getchar();
- //right
- if( ret == 67)
- {
- buffer[cmd_ptr-1] = '\\0';
- buffer[cmd_ptr-2] = '\\0';
- cmd_ptr -= 2;
- if(cmd_ptr_cp < cmd_ptr)
- {
- printf("\\033[1C");
- cmd_ptr_cp++;
- }
- continue;
- }
- //left
- else if(ret == 68)
- {
- buffer[cmd_ptr-1] = '\\0';
- buffer[cmd_ptr-2] = '\\0';
- if(cmd_ptr_cp > 0)
- {
- printf("\\033[1D");
- cmd_ptr_cp--;
- }
- cmd_ptr -= 2;
- continue;
- }
- //up
- else if(ret == 65)
- {
- buffer[cmd_ptr-1] = '\\0';
- buffer[cmd_ptr-2] = '\\0';
- cmd_ptr -= 2;
- buffer[cmd_ptr] = '\\0';
- if(cmd_show == 0)
- continue;
- //if mow = show ,mark buffer
- if(cmd_now == cmd_show && cmd_ptr != 0)
- {
- strcpy(my_cmd[cmd_now],buffer);
- // printf("\\nnow=%s show=%s buffer=%s ptr=%d cp=%d\\n",my_cmd[cmd_now], my_cmd[cmd_show], buffer, cmd_show, cmd_now);
- }
- //delete line
- printf("\\r");
- for( i=0 ; i<=strlen(buffer) ; i++)
- printf(" ");
- //move show
- cmd_show -= 1;
- strcpy(buffer,my_cmd[cmd_show]);
- printf("\\r%s",buffer);
- cmd_ptr = strlen(my_cmd[cmd_show]);
- cmd_ptr_cp= cmd_ptr;
- continue;
- }
- //down
- else if(ret == 66)
- {
- // printf("\\n0=%d 1=%c 2=%c cmd_ptr=%d cmdptr_cp=%d\\n",buffer[0], buffer[1], buffer[2], cmd_ptr, cmd_ptr_cp);
- buffer[cmd_ptr-1] = '\\0';
- buffer[cmd_ptr-2] = '\\0';
- cmd_ptr -= 2;
- // printf("\\n0=%d 1=%c 2=%c cmd_ptr=%d cmdptr_cp=%d\\n",buffer[0], buffer[1], buffer[2], cmd_ptr, cmd_ptr_cp);
- if(cmd_show == cmd_now)
- continue;
- //delete line
- printf("\\r");
- for( i=0 ; i<strlen(my_cmd[cmd_show]) ; i++)
- printf(" ");
- //move show
- cmd_show += 1;
- printf("\\r%s",my_cmd[cmd_show]);
- cmd_ptr = strlen(my_cmd[cmd_show]);
- cmd_ptr_cp= cmd_ptr;
- strcpy(buffer,my_cmd[cmd_show]);
- continue;
- }
- else
- {
- printf("%c",ret);
- continue;
- }
- }
- else
- {
- printf("%c",ret);
- continue;
- }
- }
- //backspace
- if( ret == 127)
- {
- if(cmd_ptr_cp == 0)
- continue;
- if( cmd_ptr_cp != cmd_ptr )
- {
- //change buffer
- for(i=cmd_ptr_cp-1;i<cmd_ptr;i++)
- {
- buffer[i] = buffer[i+1];
- }
- }
- cmd_ptr -= 1;
- cmd_ptr_cp -= 1;
- buffer[cmd_ptr] = '\\0';
- //delete line
- //printf("\\n\\t %d %d\\n",cmd_ptr_cp,cmd_ptr);
- for(i=0;i<cmd_ptr-cmd_ptr_cp;i++)
- {
- printf("\\033[1C");
- }
- for(i=0; i <= cmd_ptr; i++) {
- printf("\\033[1D \\033[1D");
- }
- printf("\\r%s",buffer);
- //move
- for(i=0;i<cmd_ptr-cmd_ptr_cp;i++)
- {
- printf("\\033[1D");
- }
- continue;
- }
- //huiche
- if( ret == 10 )
- {
- // printf("\\nnow=%s show=%s buffer=%s show=%d now=%d ret=%d\\n",my_cmd[cmd_now], my_cmd[cmd_show], buffer, cmd_show, cmd_now, ret);
- if(strcmp(buffer,"")==0)
- {
- printf("\\n");
- continue;
- }
- // if(cmd_now != cmd_show)
- // {
- // for(i=0; i<=strlen(my_cmd[cmd_show]); i++)
- // printf(" \\033[1D");
- // }
- //history
- if( 0 != strlen(buffer))
- {
- buffer[cmd_ptr] = '\\0';
- memcpy(my_cmd[cmd_now],buffer,strlen(buffer));
- }
- //quit
- if(strcmp(buffer,"quit") == 0)
- {
- printf("\\n");
- break;
- }
- else
- {
- //do cmd
- printf("\\n%s\\n",my_cmd[cmd_now]);
- //init buffer
- cmd_now ++;
- cmd_show = cmd_now;
- cmd_ptr = 0;
- cmd_ptr_cp = 0;
- buffer[cmd_ptr] = '\\0';
- continue;
- }
- }
- //pu tong
- if(cmd_ptr == cmd_ptr_cp)
- {
- buffer[cmd_ptr] = ret;
- cmd_ptr ++;
- cmd_ptr_cp = cmd_ptr;
- printf("%c",ret);
- }else
- {
- for(i=cmd_ptr;i>cmd_ptr_cp;i--)
- {
- buffer[i] = buffer[i-1];
- }
- buffer[cmd_ptr_cp] = ret;
- cmd_ptr++;
- cmd_ptr_cp++;
- buffer[cmd_ptr] = '\\0';
- for(i=0;i<cmd_ptr;i++)
- {
- printf("\\033[1D \\033[1D");
- }
- printf("\\r%s",buffer);
- for(i=0;i<cmd_ptr-cmd_ptr_cp;i++)
- {
- printf("\\033[1D");
- }
- }
- }
- return 0;
- }
- __attribute((destructor))
- //destory
- void my_destory()
- {
- struct termios term;
- int ret;
- ret = tcgetattr(0,&term);
- if(ret < 0)
- {
- printf("tccgetattr() return %d\\n",ret);
- return;
- }
- term.c_lflag |= ( ICANON | ECHO );
- ret = tcsetattr(0,TCSANOW,&term);
- if(ret < 0)
- {
- printf("tccsetattr() return %d\\n",ret);
- return;
- }
- return;
- }
- __attribute((constructor))
- //init
- void my_init()
- {
- struct termios term;
- int ret;
- ret = tcgetattr(0,&term);
- if(ret < 0)
- {
- printf("tccgetattr() return %d\\n",ret);
- return;
- }
- //printf("\\n\\t%08x %08x %08x \\n", term.c_lflag, ICANON, ECHO);
- term.c_lflag &= ~( ICANON | ECHO );
- ret = tcsetattr(0,TCSANOW,&term);
- if(ret < 0)
- {
- printf("tccsetattr() return %d\\n",ret);
- return;
- }
- return;
- }
- //该片段来自于http://www.codesnippet.cn/detail/1802201614558.html
来源: http://www.codesnippet.cn/detail/1802201614558.html