1
0
mirror of https://git.FreeBSD.org/ports.git synced 2024-10-23 20:51:43 +00:00
freebsd-ports/devel/cscope/files/patch-input.c
David E. O'Brien 8cad2d661d Add ^A/^E, ^B/^F editing keys for the input area.
Submitted by:	Nick Dixon (nickdixon)
Obtained from:	Cscope's Sourceforge area, patch #403750
2001-04-26 19:00:32 +00:00

134 lines
3.3 KiB
C

*** src/input.c.old Mon Feb 12 14:32:17 2001
--- src/input.c Mon Feb 12 14:51:49 2001
***************
*** 103,107 ****
--- 103,120 ----
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') {
***************
*** 114,121 ****
/* 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;
}
--- 127,177 ----
/* 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;
}
***************
*** 139,144 ****
/* if it will fit on the line */
if (i < size) {
- addch(c); /* display it */
s[i++] = c; /* save it */
}
}
--- 195,205 ----
/* 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 */
+ }
}
}
***************
*** 155,162 ****
}
/* return on an empty line to allow a command to be entered */
! if (firstchar != '\0' && i == 0) {
break;
}
}
s[i] = '\0';
return(i);
--- 216,232 ----
}
/* 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);