FW: About the KDB command line (I am sorry)

Zhang, Sonic sonic.zhang at intel.com
Wed Dec 4 17:15:43 PST 2002


Hi,

	Hope this can be my last try. :(

	Sonic Zhang


----------------------------------------------------------------------------
---------
patch: kdb-cmdline-v2.5-2.4.19-common-1
----------------------------------------------------------------------------
---------

--- linux-kdb/kdb/kdbmain.c	Wed Dec  4 15:53:39 2002
+++ linux-kdb-cmdline/kdb/kdbmain.c	Wed Dec  4 10:28:36 2002
@@ -691,7 +691,7 @@
  */
 #define KDB_CMD_HISTORY_COUNT	32
 #define CMD_BUFLEN		200	/* kdb_printf: max printline size ==
256 */
-static unsigned int cmd_head, cmd_tail;
+static unsigned int cmd_head=0, cmd_tail=0;
 static unsigned int cmdptr;
 static char cmd_hist[KDB_CMD_HISTORY_COUNT][CMD_BUFLEN];
 
@@ -887,22 +887,22 @@
 #define CTRL_N	14
 
 	/* initial situation */
-	if (cmd_head == cmd_tail) return 1;
+	if (cmd_head == cmd_tail) return 0;
 
 	switch(*cmd) {
-		case '\n':
 		case CTRL_P:
 			if (cmdptr != cmd_tail)
 				cmdptr = (cmdptr-1) % KDB_CMD_HISTORY_COUNT;
-			strcpy(cmd, cmd_hist[cmdptr]);
-			return 0;	
+			strncpy(cmd_hist[cmd_head], cmd_hist[cmdptr],
CMD_BUFLEN);
+			return 1;
 		case CTRL_N:
+			if (cmdptr == cmd_head) return 0;
 			if (cmdptr != (cmd_head-1))
 				cmdptr = (cmdptr+1) % KDB_CMD_HISTORY_COUNT;
-			strcpy(cmd, cmd_hist[cmdptr]);
-			return 0;
+			strncpy(cmd_hist[cmd_head], cmd_hist[cmdptr],
CMD_BUFLEN);
+			return 1;
 	}
-	return 1;
+	return 0;
 }
 
 
@@ -998,7 +998,7 @@
 			return KDB_CMD_GO;
 		}
 		break;
-	case KDB_REASON_CALL:	
+	case KDB_REASON_CALL:
 		if (!regs)
 			kdb_printf("kdb() called with no registers,
restricted function\n");
 		break;
@@ -1059,6 +1059,10 @@
 			KDB_STATE_SET(LONGJMP);
 #endif	/* KDB_HAVE_LONGJMP */
 
+
+		cmdbuf = cmd_hist[cmd_head];
+		*cmdbuf = '\0';
+
 do_full_getstr:
 #if defined(CONFIG_SMP)
 		kdb_printf(kdbgetenv("PROMPT"), smp_processor_id());
@@ -1066,15 +1070,15 @@
 		kdb_printf(kdbgetenv("PROMPT"));
 #endif
 
-		cmdbuf = cmd_hist[cmd_head];
-		*cmdbuf = '\0';
 		/*
 		 * Fetch command from keyboard
 		 */
 		cmdbuf = kdb_getstr(cmdbuf, CMD_BUFLEN, defcmd_in_progress ?
"[defcmd]" : "");
-		if (*cmdbuf < 32 && *cmdbuf != '\n')
-			if (handle_ctrl_cmd(cmdbuf))
-				goto do_full_getstr;
+		if (*cmdbuf < 32 && *cmdbuf != '\n') {
+			if (!handle_ctrl_cmd(cmdbuf)) *cmdbuf = '\0';
+			cmdbuf = cmd_hist[cmd_head];
+			goto do_full_getstr;
+		}

 		if (*cmdbuf != '\n') {
 			cmd_head = (cmd_head+1) % KDB_CMD_HISTORY_COUNT;


--- linux-kdb/kdb/kdb_io.c	Wed Dec  4 16:09:02 2002
+++ linux-kdb-cmdline/kdb/kdb_io.c	Wed Dec  4 16:18:42 2002
@@ -206,7 +206,7 @@

 	if (kdb_nextline == linecount) {
 #ifdef KDB_HAVE_LONGJMP
-		char buf1[16];
+		char buf1[16]="";
 #if defined(CONFIG_SMP)
 		char buf2[32];
 #endif
@@ -246,7 +246,7 @@
 		if (logging)
 			printk("%s", moreprompt);

-		kdb_read(buf1, sizeof(buf1));
+		kdb_read(buf1, 2); // '2' indicates to return immediately
after getting one key.
 		kdb_nextline = 1;	/* Really set output line 1 */

 		if ((buf1[0] == 'q') || (buf1[0] == 'Q'))

----------------------------------------------------------------------------
-----------
patch: kdb-cmdline-v2.5-2.4.19-i386-1
----------------------------------------------------------------------------
-----------

--- linux-kdb/arch/i386/kdb/kdba_io.c	Tue Dec  3 13:25:48 2002
+++ linux-kdb-cmdline/arch/i386/kdb/kdba_io.c	Wed Dec  4 16:51:03 2002
@@ -219,15 +219,6 @@
 			ch = 8;
 		if (ch == '\t')
 			ch = ' ';
-		if (ch == 8) {		/* BS */
-			;
-		} else if (ch == 13) {	/* Enter */
-			kdb_printf("\n");
-		} else {
-			if (!isprint(ch))
-				return(-1);
-			kdb_printf("%c", ch);
-		}
 		return ch;
 	}
 	return -1;
@@ -335,6 +326,24 @@
 		return 8;
 	}
 
+	// Arrow Key and Del Key
+	switch (scancode) {
+	case 0x53: // Del
+		return 4;
+	case 0x47: // Home
+		return 1;
+	case 0x4F: // End
+		return 5;
+	case 0x4B: // Left
+		return 2;
+	case 0x48: // Up
+		return 16;
+	case 0x50: // Down
+		return 14;
+	case 0x4D: // Right
+		return 6;
+	}
+
 	if (scancode == 0xe0) {
 		return -1;
 	}
@@ -407,11 +416,6 @@
 		return 13;
 	}
 
-	/*
-	 * echo the character.
-	 */
-	kdb_printf("%c", keychar&0xff);
-
 	return keychar & 0xff;
 }
 #endif	/* CONFIG_VT_CONSOLE */
@@ -460,12 +464,51 @@
 	NULL
 };
 
+#define CMD_BUFLEN 256
+
+static void kdb_printprompt(void)
+{
+#if defined(CONFIG_SMP)
+	kdb_printf(kdbgetenv("PROMPT"), smp_processor_id());
+#else
+	kdb_printf(kdbgetenv("PROMPT"));
+#endif
+}
+
+static int kdb_promptlength(void)
+{
+#if defined(CONFIG_SMP)
+	char promptstr[30];
+	snprintf(promptstr, 30, kdbgetenv("PROMPT"), smp_processor_id());
+	return strlen(promptstr);
+#else
+	return strlen(kdbgetenv("PROMPT");
+#endif
+}
+
+// The bufsize must >= 2 .
+// If bufsize == 2, that means this routine returns immediately after
receiving one key.
 char *
 kdba_read(char *buffer, size_t bufsize)
 {
 	char	*cp = buffer;
 	char	*bufend = buffer+bufsize-2;	/* Reserve space for newline
and null byte */
 
+	char	*lastchar;
+	char	tmp;
+	static char	tmpbuffer[CMD_BUFLEN];
+	int len = strlen(buffer);
+
+	if (len > 0 ) {
+		cp += len;
+		if (*(buffer+len-1) == '\n')
+			cp--;
+	}
+
+	lastchar = cp;
+	*cp = '\0';
+	kdb_printf("%s", buffer);
+
 	for (;;) {
 		int key;
 		get_char_func *f;
@@ -479,23 +522,102 @@
 			if (key != -1)
 				break;
 		}
+		if (bufsize <= 2) {
+			*buffer++ = (char)key;
+			*buffer = '\0';
+			return buffer;
+		}
 
-		/* Echo is done in the low level functions */
 		switch (key) {
 		case 8: /* backspace */
 			if (cp > buffer) {
-				kdb_printf("\b \b");
+				if (cp < lastchar) {
+					memcpy(tmpbuffer, cp, lastchar -
cp);
+					memcpy(cp-1, tmpbuffer, lastchar -
cp);
+				}
+				*(--lastchar) = '\0';
 				--cp;
+				kdb_printf("\b%s \r", cp);
+				tmp = *cp;
+				*cp = '\0';
+				kdb_printprompt();
+				kdb_printf("%s", buffer);
+				*cp = tmp;
 			}
 			break;
-		case 10: /* enter */
 		case 13: /* enter */
-			*cp++ = '\n';
-			*cp++ = '\0';
+			*lastchar++ = '\n';
+			*lastchar++ = '\0';
+			kdb_printf("\n");
 			return buffer;
+		case 4: /* Del */
+			if(cp < lastchar) {
+				memcpy(tmpbuffer, cp+1, lastchar - cp -1);
+				memcpy(cp, tmpbuffer, lastchar - cp -1);
+				*(--lastchar) = '\0';
+				kdb_printf("%s \r", cp);
+				tmp = *cp;
+				*cp = '\0';
+				kdb_printprompt();
+				kdb_printf("%s", buffer);
+				*cp = tmp;
+			}
+			break;
+		case 1: /* Home */
+			if(cp > buffer) {
+				kdb_printf("\r");
+				kdb_printprompt();
+				cp = buffer;
+			}
+			break;
+		case 5: /* End */
+			if(cp < lastchar) {
+				kdb_printf("%s", cp);
+				cp = lastchar;
+			}
+			break;
+		case 2: /* Left */
+			if (cp > buffer) {
+				kdb_printf("\b");
+				--cp;
+			}
+			break;
+		case 14: /* Down */
+			memset(tmpbuffer, ' ',
kdb_promptlength()+(lastchar-buffer));
+			*(tmpbuffer+kdb_promptlength()+(lastchar-buffer)) =
'\0';
+			kdb_printf("\r%s\r", tmpbuffer);
+			*lastchar = (char)key;
+			*(lastchar+1) = '\0';
+			return lastchar;
+		case 6: /* Right */
+			if (cp < lastchar) {
+				kdb_printf("%c", *cp);
+				++cp;
+			}
+			break;
+		case 16: /* Up */
+			memset(tmpbuffer, ' ',
kdb_promptlength()+(lastchar-buffer));
+			*(tmpbuffer+kdb_promptlength()+(lastchar-buffer)) =
'\0';
+			kdb_printf("\r%s\r", tmpbuffer);
+			*lastchar = (char)key;
+			*(lastchar+1) = '\0';
+			return lastchar;
 		default:
-			if (cp < bufend)
-				*cp++ = key;
+			if (key >= 32 &&lastchar < bufend) {
+				if (cp < lastchar) {
+					memcpy(tmpbuffer, cp, lastchar -
cp);
+					memcpy(cp+1, tmpbuffer, lastchar -
cp);
+				}
+				*(++lastchar) = '\0';
+				*cp = key;
+				kdb_printf("%s\r", cp);
+				++cp;
+				tmp = *cp;
+				*cp = '\0';
+				kdb_printprompt();
+				kdb_printf("%s", buffer);
+				*cp = tmp;
+			}
 			break;
 		}
 	}

----------------------------------------------------------------------------
-----------




More information about the kdb mailing list