From: Petr S. <pe...@us...> - 2001-05-30 21:10:58
|
Update of /cvsroot/cscope/cscope/src In directory usw-pr-cvs1:/tmp/cvs-serv13424/src Modified Files: input.c Log Message: (Nick Dixon) Improvement in handling cursor and editing keys on the input lines. Index: input.c =================================================================== RCS file: /cvsroot/cscope/cscope/src/input.c,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -r1.6 -r1.7 *** input.c 2001/02/09 19:59:59 1.6 --- input.c 2001/05/30 21:10:56 1.7 *************** *** 104,108 **** --- 104,121 ---- 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); + /* if a character already has been typed */ if (firstchar != '\0') { *************** *** 115,122 **** /* until the end of the line is reached */ while ((c = mygetch()) != '\r' && c != '\n' && c != KEY_ENTER) { ! if (c == erasechar() || c == KEY_BACKSPACE || c == DEL || c == ctrl('H') ) { /* erase */ if (i > 0) { ! addstr("\b \b"); --i; } --- 128,178 ---- /* 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; } *************** *** 140,145 **** /* if it will fit on the line */ if (i < size) { - addch(c); /* display it */ s[i++] = c; /* save it */ } } --- 196,206 ---- /* 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 */ + } } } *************** *** 156,163 **** } /* return on an empty line to allow a command to be entered */ ! if (firstchar != '\0' && i == 0) { break; } } s[i] = '\0'; return(i); --- 217,233 ---- } /* 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 + */ + for (; ri > 0; ) { + s[i++] = sright[--ri]; + } + free(sright); + s[i] = '\0'; return(i); |