From 45f9a29e481ce9ea7ca7121541f0e0f90147f5b1 Mon Sep 17 00:00:00 2001 From: John Hodge Date: Fri, 2 Apr 2010 21:31:55 +0800 Subject: [PATCH] Fixed keyboard bug where keypresses were not being registered, working on libreadline - Keyboard now reads from 0x60 in keyboard setup to clear keyboard IRQ buffer. - libreadline is unstable, but supports command histories (just don't try to edit a command in the history) --- Kernel/Makefile.BuildNum | 2 +- Kernel/drv/kb.c | 4 +- Makefile.cfg | 2 +- Modules/IPStack/tcp.c | 7 ++ Usermode/Applications/CLIShell_src/Makefile | 1 + Usermode/Applications/CLIShell_src/main.c | 24 ++++++ .../Libraries/libreadline.so_src/Makefile | 13 ++++ Usermode/Libraries/libreadline.so_src/main.c | 78 ++++++++++++------- Usermode/include/readline.h | 28 +++++++ 9 files changed, 130 insertions(+), 29 deletions(-) create mode 100644 Usermode/Libraries/libreadline.so_src/Makefile create mode 100644 Usermode/include/readline.h diff --git a/Kernel/Makefile.BuildNum b/Kernel/Makefile.BuildNum index 6bf24dd5..f17258be 100644 --- a/Kernel/Makefile.BuildNum +++ b/Kernel/Makefile.BuildNum @@ -1 +1 @@ -BUILD_NUM = 1740 +BUILD_NUM = 1745 diff --git a/Kernel/drv/kb.c b/Kernel/drv/kb.c index f6a73132..ba9eb72c 100644 --- a/Kernel/drv/kb.c +++ b/Kernel/drv/kb.c @@ -64,6 +64,7 @@ int KB_Install(char **Arguments) temp = inb(0x61); outb(0x61, temp | 0x80); outb(0x61, temp & 0x7F); + inb(0x60); // Clear keyboard buffer IRQ_AddHandler(1, KB_IRQHandler); DevFS_AddDevice( &gKB_DevInfo ); @@ -81,7 +82,8 @@ void KB_IRQHandler() Uint32 ch; // int keyNum; - //if( inportb(0x64) & 0x20 ) return; + // Check port 0x64 to tell if this is from the aux port + if( inb(0x64) & 0x20 ) return; scancode = inb(0x60); // Read from the keyboard's data buffer //Log_Debug("Keyboard", "scancode = %02x", scancode); diff --git a/Makefile.cfg b/Makefile.cfg index 51c4802d..08cf64d4 100644 --- a/Makefile.cfg +++ b/Makefile.cfg @@ -27,7 +27,7 @@ FILESYSTEMS = DRIVERS = MODULES = Storage/ATA Storage/FDD MODULES += Network/NE2000 -MODULES += Display/VESA +#MODULES += Display/VESA #MODULES += Display/BochsGA MODULES += Filesystems/Ext2 MODULES += Filesystems/FAT diff --git a/Modules/IPStack/tcp.c b/Modules/IPStack/tcp.c index 741ec140..36837a5f 100644 --- a/Modules/IPStack/tcp.c +++ b/Modules/IPStack/tcp.c @@ -482,6 +482,13 @@ tVFS_Node *TCP_Server_Init(tInterface *Interface) { tTCPListener *srv = malloc( sizeof(tTCPListener) ); + Log_Debug("TCP", "srv = %p", srv); + + if( srv == NULL ) { + Log_Warning("TCP", "malloc failed for listener (%i) bytes", sizeof(tTCPListener)); + return NULL; + } + srv->Interface = Interface; srv->Port = 0; srv->NextID = 0; diff --git a/Usermode/Applications/CLIShell_src/Makefile b/Usermode/Applications/CLIShell_src/Makefile index 01b49eed..ef770485 100644 --- a/Usermode/Applications/CLIShell_src/Makefile +++ b/Usermode/Applications/CLIShell_src/Makefile @@ -3,6 +3,7 @@ -include ../Makefile.cfg CPPFLAGS += -I./include +LDFLAGS += -lreadline BIN = ../CLIShell OBJ = main.o lib.o diff --git a/Usermode/Applications/CLIShell_src/main.c b/Usermode/Applications/CLIShell_src/main.c index 1f381e26..579df881 100644 --- a/Usermode/Applications/CLIShell_src/main.c +++ b/Usermode/Applications/CLIShell_src/main.c @@ -1,12 +1,17 @@ /* * AcessOS Shell Version 3 */ +#define USE_READLINE 0 #include #include #include #include #include "header.h" +#if USE_READLINE +# include "readline.h" +#endif + #define _stdin 0 #define _stdout 1 #define _stderr 2 @@ -51,7 +56,15 @@ int main(int argc, char *argv[], char *envp[]) int length = 0; int i; int iArgCount = 0; + #if !USE_READLINE int bCached = 1; + #else + tReadline readline_state = {0}; + #endif + + #if USE_READLINE + readline_state.UseHistory = 1; + #endif gasEnvironment = envp; @@ -74,13 +87,19 @@ int main(int argc, char *argv[], char *envp[]) { // Free last command & arguments if(saArgs[0]) free(saArgs); + #if !USE_READLINE if(!bCached) free(sCommandStr); bCached = 0; + #endif write(_stdout, strlen(gsCurrentDirectory), gsCurrentDirectory); write(_stdout, 2, "$ "); // Read Command line + #if USE_READLINE + sCommandStr = Readline( &readline_state ); + length = strlen(sCommandStr); + #else sCommandStr = ReadCommandLine( &length ); if(!sCommandStr) { @@ -99,6 +118,7 @@ int main(int argc, char *argv[], char *envp[]) gasCommandHistory[ giLastCommand ] = sCommandStr; bCached = 1; } + #endif // Parse Command Line into arguments Parse_Args(sCommandStr, saArgs); @@ -123,6 +143,10 @@ int main(int argc, char *argv[], char *envp[]) // Shall we? CallCommand( &saArgs[1] ); + + #if USE_READLINE + free( sCommandStr ); + #endif } } diff --git a/Usermode/Libraries/libreadline.so_src/Makefile b/Usermode/Libraries/libreadline.so_src/Makefile new file mode 100644 index 00000000..fefbf0c1 --- /dev/null +++ b/Usermode/Libraries/libreadline.so_src/Makefile @@ -0,0 +1,13 @@ +# Acess 2 - AxWin GUI Library +# + +include ../Makefile.cfg + +CPPFLAGS += +CFLAGS += -Wall +LDFLAGS += -lc -soname libreadline.so + +OBJ = main.o +BIN = ../libreadline.so + +include ../Makefile.tpl diff --git a/Usermode/Libraries/libreadline.so_src/main.c b/Usermode/Libraries/libreadline.so_src/main.c index f2ddf684..3af20eeb 100644 --- a/Usermode/Libraries/libreadline.so_src/main.c +++ b/Usermode/Libraries/libreadline.so_src/main.c @@ -5,14 +5,31 @@ * Text mode entry with history */ #include +#include #include +#include +#include + +#define STDIN_FD 0 +#define STDOUT_FD 1 + +// === PROTOTYPES === + int SoMain(); +tReadline *Readline_CreateInstance(int bUseHistory); +char *Readline(tReadline *Info); // === GLOBALS === // === CODE === +int SoMain() +{ + return 0; +} + char *Readline(tReadline *Info) { char *ret; + char *orig; int len, pos, space = 1023-8-8; // optimised for the heap manager char ch; int scrollbackPos = Info->NumHistory; @@ -21,10 +38,12 @@ char *Readline(tReadline *Info) ret = malloc( space+1 ); if(!ret) return NULL; len = 0; pos = 0; - + + orig = ret; + // Read In Command Line do { - read(_stdin, 1, &ch); // Read Character from stdin (read is a blocking call) + read(STDIN_FD, 1, &ch); // Read Character from stdin (read is a blocking call) if(ch == '\n') break; @@ -32,13 +51,13 @@ char *Readline(tReadline *Info) { // Control characters case '\x1B': - read(_stdin, 1, &ch); // Read control character + read(STDIN_FD, 1, &ch); // Read control character switch(ch) { //case 'D': if(pos) pos--; break; //case 'C': if(posHistory[--scrollbackPos] ); - len = strlen(ret); - while(pos--) write(_stdout, 3, "\x1B[D"); - write(_stdout, len, ret); pos = len; - while(pos++ < oldLen) write(_stdout, 1, " "); + space = len = strlen(ret); + while(pos-->1) write(STDOUT_FD, 3, "\x1B[D"); + write(STDOUT_FD, len, ret); pos = len; + while(pos++ < oldLen) write(STDOUT_FD, 1, " "); } break; case 'B': // Down @@ -60,24 +79,24 @@ char *Readline(tReadline *Info) int oldLen = len; if( scrollbackPos >= Info->NumHistory ) break; - free(ret); + if(ret != orig) free(ret); ret = strdup( Info->History[scrollbackPos++] ); - len = strlen(ret); - while(pos--) write(_stdout, 3, "\x1B[D"); - write(_stdout, len, ret); pos = len; - while(pos++ < oldLen) write(_stdout, 1, " "); + space = len = strlen(ret); + while(pos-->1) write(STDOUT_FD, 3, "\x1B[D"); + write(STDOUT_FD, len, ret); pos = len; + while(pos++ < oldLen) write(STDOUT_FD, 1, " "); } break; case 'D': // Left if(pos == 0) break; pos --; - write(_stdout, 3, "\x1B[D"); + write(STDOUT_FD, 3, "\x1B[D"); break; case 'C': // Right if(pos == len) break; pos++; - write(_stdout, 3, "\x1B[C"); + write(STDOUT_FD, 3, "\x1B[C"); break; } } @@ -86,7 +105,7 @@ char *Readline(tReadline *Info) // Backspace case '\b': if(len <= 0) break; // Protect against underflows - write(_stdout, 1, &ch); + write(STDOUT_FD, 1, &ch); if(pos == len) { // Simple case of end of string len --; pos--; @@ -96,9 +115,9 @@ char *Readline(tReadline *Info) buf[2] += ((len-pos+1)/100) % 10; buf[3] += ((len-pos+1)/10) % 10; buf[4] += (len-pos+1) % 10; - write(_stdout, len-pos, &ret[pos]); // Move Text - ch = ' '; write(_stdout, 1, &ch); ch = '\b'; // Clear deleted character - write(_stdout, 7, buf); // Update Cursor + write(STDOUT_FD, len-pos, &ret[pos]); // Move Text + ch = ' '; write(STDOUT_FD, 1, &ch); ch = '\b'; // Clear deleted character + write(STDOUT_FD, 7, buf); // Update Cursor // Alter Buffer memmove(&ret[pos-1], &ret[pos], len-pos); pos --; @@ -116,7 +135,12 @@ char *Readline(tReadline *Info) // Expand Buffer if(len+1 > space) { space += 256; - ret = realloc(ret, space+1); + if(ret == orig) { + orig = ret = realloc(ret, space+1); + } + else { + ret = realloc(ret, space+1); + } if(!ret) return NULL; } @@ -126,13 +150,13 @@ char *Readline(tReadline *Info) buf[2] += ((len-pos)/100) % 10; buf[3] += ((len-pos)/10) % 10; buf[4] += (len-pos) % 10; - write(_stdout, 1, &ch); // Print new character - write(_stdout, len-pos, &ret[pos]); // Move Text - write(_stdout, 7, buf); // Update Cursor + write(STDOUT_FD, 1, &ch); // Print new character + write(STDOUT_FD, len-pos, &ret[pos]); // Move Text + write(STDOUT_FD, 7, buf); // Update Cursor memmove( &ret[pos+1], &ret[pos], len-pos ); } else { - write(_stdout, 1, &ch); + write(STDOUT_FD, 1, &ch); } ret[pos++] = ch; len ++; @@ -150,7 +174,7 @@ char *Readline(tReadline *Info) // Add to history if( Info->UseHistory ) { - if( strcmp( Info->History[ Info->NumHistory-1 ], ret) != 0 ) + if( !Info->History || strcmp( Info->History[ Info->NumHistory-1 ], ret) != 0 ) { void *tmp; Info->NumHistory ++; @@ -163,5 +187,7 @@ char *Readline(tReadline *Info) } } + if(ret != orig) free(orig); + return ret; } diff --git a/Usermode/include/readline.h b/Usermode/include/readline.h new file mode 100644 index 00000000..831bb538 --- /dev/null +++ b/Usermode/include/readline.h @@ -0,0 +1,28 @@ +/* + * Acess2 Library Suite + * - Readline + * + * Text mode entry with history + */ +#ifndef _READLINE_H_ +#define _READLINE_H_ + +// === TYPES === +typedef struct sReadline tReadline; + +// === STRUCTURES === +struct sReadline +{ + int UseHistory; // Boolean + + int NumHistory; + char **History; +}; + +// === FUNCTIONS === +/** + * \brief Read a line from stdin + */ +extern char *Readline(tReadline *Info); + +#endif -- 2.20.1