From: Hans-Bernhard B. <br...@us...> - 2004-04-30 12:09:24
|
Update of /cvsroot/cscope/cscope/src In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv23688/src Modified Files: command.c input.c global.h Log Message: Make input fields editable after recalling them from history (Ctrl-B/F). Index: command.c =================================================================== RCS file: /cvsroot/cscope/cscope/src/command.c,v retrieving revision 1.21 retrieving revision 1.22 diff -C2 -r1.21 -r1.22 *** command.c 14 Feb 2004 18:25:15 -0000 1.21 --- command.c 30 Apr 2004 12:09:14 -0000 1.22 *************** *** 460,468 **** case '\n': goto repeat; ! default: (void) myungetch(c); atfield(); (void) clrtoeol(); /* clear current field */ break; } } --- 460,477 ---- case '\n': goto repeat; ! case ctrl('F'): ! case ctrl('B'): (void) myungetch(c); atfield(); (void) clrtoeol(); /* clear current field */ break; + default: + (void) myungetch(c); + if (mygetline(pattern, newpat, COLS - fldcolumn - 1, '\0', caseless )) { + strcpy (pattern, newpat); + resetcmd(); + } + goto repeat; + break; } } Index: input.c =================================================================== RCS file: /cvsroot/cscope/cscope/src/input.c,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -r1.10 -r1.11 *** input.c 12 Feb 2004 18:14:05 -0000 1.10 --- input.c 30 Apr 2004 12:09:14 -0000 1.11 *************** *** 54,58 **** /* Internal prototypes: */ ! static RETSIGTYPE catchint(int sig); /* catch the interrupt signal */ --- 54,58 ---- /* Internal prototypes: */ ! static RETSIGTYPE catchint(int sig); /* catch the interrupt signal */ *************** *** 68,72 **** /* unget a character */ - void myungetch(int c) --- 68,71 ---- *************** *** 76,80 **** /* get a character from the terminal */ - int mygetch(void) --- 75,78 ---- *************** *** 103,106 **** --- 101,236 ---- int + mygetline(char p[], char s[], unsigned size, int firstchar, BOOL iscaseless) + { + int c, i = 0; + int j; + char *sright; /* substring to the right of the cursor */ + int ri = 0; /* position in right-string */ + + /* Inserts and deletes are always performed on the left-string, + * but we'll also have a right-string 'sright' to hold characters + * which are on the right of the cursor [insertion point]. + * + * Think of 'sright' as a stack -- we push chars into it when the cursor + * moves left, and we pop chars off it when the cursor moves right again. + * At the end of the function, we'll pop off any remaining characters + * onto the end of 's' + */ + sright = calloc(sizeof(char), size ); + + strcpy ( s, p); + i += strlen(p); + /* if a character already has been typed */ + if (firstchar != '\0') { + if(iscaseless == YES) { + firstchar = tolower(firstchar); + } + addch(firstchar); /* display it */ + s[i++] = firstchar; /* save it */ + } + /* until the end of the line is reached */ + while ((c = mygetch()) != '\r' && c != '\n' && c != KEY_ENTER) { + if (c == KEY_LEFT || c == ctrl('B')) { /* left */ + if (i > 0) { + addch('\b'); + /* move this char into the second (rhs) string */ + sright[ri++] = s[--i]; + } + } else if (c == KEY_RIGHT || c == ctrl('F')) { /* right */ + if (i < size && ri > 0) { + /* move this char to the left of the cursor */ + s[i++] = sright[--ri]; + addch(s[i-1]); + } + } else if ( + #ifdef KEY_HOME + c == KEY_HOME || + #endif + c == ctrl('A') ) { + while (i > 0) { + sright[ri++] = s[--i]; + addch('\b'); + addch(s[i]); + addch('\b'); + } + } else if ( + #ifdef KEY_END + c == KEY_END || + #endif + c == ctrl('E') ) { + while (ri > 0) { + s[i++] = sright[--ri]; + addch(s[i-1]); + } + } else if (c == erasechar() || c == KEY_BACKSPACE + || c == DEL || c == ctrl('H') ) { + /* erase */ + if (i > 0) { + if (ri == 0) { + addstr("\b \b"); + } else { + addch('\b'); + delch(); + } + s[i] = '\0'; + --i; + } + } else if (c == killchar() || c == KEY_BREAK) { + /* kill */ + for (j = 0; j < i; ++j) { + addch('\b'); + } + for (j = 0; j < i; ++j) { + addch(' '); + } + for (j = 0; j < i; ++j) { + addch('\b'); + } + i = 0; + } else if (isprint(c) || c == '\t') { + /* printable */ + if(iscaseless == YES) { + c = tolower(c); + } + /* if it will fit on the line */ + if (i < size) { + s[i++] = c; /* save it */ + if (ri == 0) { + addch(c); /* display it */ + } else { + insch(c); /* display it */ + addch(c); /* advance cursor */ + } + } + #if UNIXPC + } else if (unixpcmouse == YES && c == ESC) { /* mouse */ + getmouseaction(ESC); /* ignore it */ + #endif + } else if (mouse == YES && c == ctrl('X')) { + getmouseaction(ctrl('X')); /* ignore it */ + } else if (c == EOF) { /* end-of-file */ + break; + } + + /* return on an empty line to allow a command to be entered */ + if (firstchar != '\0' && (i+ri) == 0) { + break; + } + } + + /* move any remaining chars on the rhs of the cursor + * onto the end of our string + */ + while (ri > 0) { + s[i++] = sright[--ri]; + } + free(sright); + + s[i] = '\0'; + return(i); + } + /* get a line from the terminal in non-canonical mode */ + + int getline(char s[], unsigned size, int firstchar, BOOL iscaseless) { Index: global.h =================================================================== RCS file: /cvsroot/cscope/cscope/src/global.h,v retrieving revision 1.29 retrieving revision 1.30 diff -C2 -r1.29 -r1.30 *** global.h 24 Feb 2004 15:13:21 -0000 1.29 --- global.h 30 Apr 2004 12:09:14 -0000 1.30 *************** *** 407,410 **** --- 407,411 ---- int egrep(char *file, FILE *output, char *format); int getline(char s[], unsigned size, int firstchar, BOOL iscaseless); + int mygetline(char p[], char s[], unsigned size, int firstchar, BOOL iscaseless); int mygetch(void); int hash(char *ss); |