svn commit: trunk/busybox/miscutils

vda at busybox.net vda at busybox.net
Sun Nov 2 00:55:41 UTC 2008


Author: vda
Date: 2008-11-01 17:55:41 -0700 (Sat, 01 Nov 2008)
New Revision: 23899

Log:
less: fix pasting into search line ('/' cmd) -
 it was mishandled because pasting "types" very fast
 and read_key eats many chars. +30 bytes.



Modified:
   trunk/busybox/miscutils/less.c


Changeset:
Modified: trunk/busybox/miscutils/less.c
===================================================================
--- trunk/busybox/miscutils/less.c	2008-11-02 00:41:05 UTC (rev 23898)
+++ trunk/busybox/miscutils/less.c	2008-11-02 00:55:41 UTC (rev 23899)
@@ -96,7 +96,9 @@
 	smallint pattern_valid;
 #endif
 	smallint terminated;
+	smalluint kbd_input_size;
 	struct termios term_orig, term_less;
+	char kbd_input[KEYCODE_BUFFER_SIZE];
 };
 #define G (*ptr_to_globals)
 #define cur_fline           (G.cur_fline         )
@@ -133,6 +135,8 @@
 #define terminated          (G.terminated        )
 #define term_orig           (G.term_orig         )
 #define term_less           (G.term_less         )
+#define kbd_input_size      (G.kbd_input_size    )
+#define kbd_input           (G.kbd_input         )
 #define INIT_G() do { \
 	SET_PTR_TO_GLOBALS(xzalloc(sizeof(G))); \
 	less_gets_pos = -1; \
@@ -806,7 +810,6 @@
 
 static ssize_t getch_nowait(void)
 {
-	char input[KEYCODE_BUFFER_SIZE];
 	int rd;
 	struct pollfd pfd[2];
 
@@ -837,22 +840,25 @@
 	if (less_gets_pos >= 0)
 		move_cursor(max_displayed_line + 2, less_gets_pos + 1);
 	fflush(stdout);
+
+	if (kbd_input_size == 0) {
 #if ENABLE_FEATURE_LESS_WINCH
-	while (1) {
-		int r;
-		/* NB: SIGWINCH interrupts poll() */
-		r = poll(pfd + rd, 2 - rd, -1);
-		if (/*r < 0 && errno == EINTR &&*/ winch_counter)
-			return '\\'; /* anything which has no defined function */
-		if (r) break;
-	}
+		while (1) {
+			int r;
+			/* NB: SIGWINCH interrupts poll() */
+			r = poll(pfd + rd, 2 - rd, -1);
+			if (/*r < 0 && errno == EINTR &&*/ winch_counter)
+				return '\\'; /* anything which has no defined function */
+			if (r) break;
+		}
 #else
-	safe_poll(pfd + rd, 2 - rd, -1);
+		safe_poll(pfd + rd, 2 - rd, -1);
 #endif
+	}
 
 	/* We have kbd_fd in O_NONBLOCK mode, read inside read_key()
 	 * would not block even if there is no input available */
-	rd = read_key(kbd_fd, NULL, input);
+	rd = read_key(kbd_fd, &kbd_input_size, kbd_input);
 	if (rd == -1) {
 		if (errno == EAGAIN) {
 			/* No keyboard input available. Since poll() did return,




More information about the busybox-cvs mailing list