Fixed keyboard bug where keypresses were not being registered, working on libreadline
authorJohn Hodge <[email protected]>
Fri, 2 Apr 2010 13:31:55 +0000 (21:31 +0800)
committerJohn Hodge <[email protected]>
Fri, 2 Apr 2010 13:31:55 +0000 (21:31 +0800)
- 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
Kernel/drv/kb.c
Makefile.cfg
Modules/IPStack/tcp.c
Usermode/Applications/CLIShell_src/Makefile
Usermode/Applications/CLIShell_src/main.c
Usermode/Libraries/libreadline.so_src/Makefile [new file with mode: 0644]
Usermode/Libraries/libreadline.so_src/main.c
Usermode/include/readline.h [new file with mode: 0644]

index 6bf24dd..f17258b 100644 (file)
@@ -1 +1 @@
-BUILD_NUM = 1740
+BUILD_NUM = 1745
index f6a7313..ba9eb72 100644 (file)
@@ -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);
index 51c4802..08cf64d 100644 (file)
@@ -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
index 741ec14..36837a5 100644 (file)
@@ -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;
index 01b49ee..ef77048 100644 (file)
@@ -3,6 +3,7 @@
 -include ../Makefile.cfg\r
 \r
 CPPFLAGS += -I./include\r
+LDFLAGS += -lreadline\r
 \r
 BIN = ../CLIShell\r
 OBJ = main.o lib.o\r
index 1f381e2..579df88 100644 (file)
@@ -1,12 +1,17 @@
 /*\r
  * AcessOS Shell Version 3\r
  */\r
+#define USE_READLINE   0\r
 #include <acess/sys.h>\r
 #include <stdlib.h>\r
 #include <stdio.h>\r
 #include <string.h>\r
 #include "header.h"\r
 \r
+#if USE_READLINE\r
+# include "readline.h"\r
+#endif\r
+\r
 #define _stdin 0\r
 #define _stdout        1\r
 #define _stderr        2\r
@@ -51,7 +56,15 @@ int main(int argc, char *argv[], char *envp[])
         int    length = 0;\r
         int    i;\r
         int    iArgCount = 0;\r
+       #if !USE_READLINE\r
         int    bCached = 1;\r
+       #else\r
+       tReadline       readline_state = {0};\r
+       #endif\r
+       \r
+       #if USE_READLINE\r
+       readline_state.UseHistory = 1;\r
+       #endif\r
        \r
        gasEnvironment = envp;\r
        \r
@@ -74,13 +87,19 @@ int main(int argc, char *argv[], char *envp[])
        {\r
                // Free last command & arguments\r
                if(saArgs[0])   free(saArgs);\r
+               #if !USE_READLINE\r
                if(!bCached)    free(sCommandStr);\r
                bCached = 0;\r
+               #endif\r
                \r
                write(_stdout, strlen(gsCurrentDirectory), gsCurrentDirectory);\r
                write(_stdout, 2, "$ ");\r
                \r
                // Read Command line\r
+               #if USE_READLINE\r
+               sCommandStr = Readline( &readline_state );\r
+               length = strlen(sCommandStr);\r
+               #else\r
                sCommandStr = ReadCommandLine( &length );\r
                \r
                if(!sCommandStr) {\r
@@ -99,6 +118,7 @@ int main(int argc, char *argv[], char *envp[])
                        gasCommandHistory[ giLastCommand ] = sCommandStr;\r
                        bCached = 1;\r
                }\r
+               #endif\r
                \r
                // Parse Command Line into arguments\r
                Parse_Args(sCommandStr, saArgs);\r
@@ -123,6 +143,10 @@ int main(int argc, char *argv[], char *envp[])
                \r
                // Shall we?\r
                CallCommand( &saArgs[1] );\r
+               \r
+               #if USE_READLINE\r
+               free( sCommandStr );\r
+               #endif\r
        }\r
 }\r
 \r
diff --git a/Usermode/Libraries/libreadline.so_src/Makefile b/Usermode/Libraries/libreadline.so_src/Makefile
new file mode 100644 (file)
index 0000000..fefbf0c
--- /dev/null
@@ -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
index f2ddf68..3af20ee 100644 (file)
@@ -5,14 +5,31 @@
  * Text mode entry with history
  */
 #include <readline.h>
+#include <acess/sys.h>
 #include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#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(pos<len)     pos++;  break;
                        case '[':
-                               read(_stdin, 1, &ch);   // Read control character
+                               read(STDIN_FD, 1, &ch); // Read control character
                                switch(ch)
                                {
                                case 'A':       // Up
@@ -46,13 +65,13 @@ char *Readline(tReadline *Info)
                                                 int    oldLen = len;
                                                if( scrollbackPos <= 0 )        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 '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 (file)
index 0000000..831bb53
--- /dev/null
@@ -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

UCC git Repository :: git.ucc.asn.au