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