|
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);
|