- 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)
temp = inb(0x61);
outb(0x61, temp | 0x80);
outb(0x61, temp & 0x7F);
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 );
IRQ_AddHandler(1, KB_IRQHandler);
DevFS_AddDevice( &gKB_DevInfo );
Uint32 ch;
// int keyNum;
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);
scancode = inb(0x60); // Read from the keyboard's data buffer
//Log_Debug("Keyboard", "scancode = %02x", scancode);
DRIVERS =
MODULES = Storage/ATA Storage/FDD
MODULES += Network/NE2000
DRIVERS =
MODULES = Storage/ATA Storage/FDD
MODULES += Network/NE2000
+#MODULES += Display/VESA
#MODULES += Display/BochsGA
MODULES += Filesystems/Ext2
MODULES += Filesystems/FAT
#MODULES += Display/BochsGA
MODULES += Filesystems/Ext2
MODULES += Filesystems/FAT
{
tTCPListener *srv = malloc( sizeof(tTCPListener) );
{
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;
srv->Interface = Interface;
srv->Port = 0;
srv->NextID = 0;
-include ../Makefile.cfg\r
\r
CPPFLAGS += -I./include\r
-include ../Makefile.cfg\r
\r
CPPFLAGS += -I./include\r
\r
BIN = ../CLIShell\r
OBJ = main.o lib.o\r
\r
BIN = ../CLIShell\r
OBJ = main.o lib.o\r
/*\r
* AcessOS Shell Version 3\r
*/\r
/*\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
#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
#define _stdin 0\r
#define _stdout 1\r
#define _stderr 2\r
int length = 0;\r
int i;\r
int iArgCount = 0;\r
int length = 0;\r
int i;\r
int iArgCount = 0;\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
\r
gasEnvironment = envp;\r
\r
{\r
// Free last command & arguments\r
if(saArgs[0]) free(saArgs);\r
{\r
// Free last command & arguments\r
if(saArgs[0]) free(saArgs);\r
if(!bCached) free(sCommandStr);\r
bCached = 0;\r
if(!bCached) free(sCommandStr);\r
bCached = 0;\r
\r
write(_stdout, strlen(gsCurrentDirectory), gsCurrentDirectory);\r
write(_stdout, 2, "$ ");\r
\r
// Read Command line\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
sCommandStr = ReadCommandLine( &length );\r
\r
if(!sCommandStr) {\r
gasCommandHistory[ giLastCommand ] = sCommandStr;\r
bCached = 1;\r
}\r
gasCommandHistory[ giLastCommand ] = sCommandStr;\r
bCached = 1;\r
}\r
\r
// Parse Command Line into arguments\r
Parse_Args(sCommandStr, saArgs);\r
\r
// Parse Command Line into arguments\r
Parse_Args(sCommandStr, saArgs);\r
\r
// Shall we?\r
CallCommand( &saArgs[1] );\r
\r
// Shall we?\r
CallCommand( &saArgs[1] );\r
+ \r
+ #if USE_READLINE\r
+ free( sCommandStr );\r
+ #endif\r
--- /dev/null
+# 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
* Text mode entry with history
*/
#include <readline.h>
* Text mode entry with history
*/
#include <readline.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 ===
// === GLOBALS ===
// === CODE ===
+int SoMain()
+{
+ return 0;
+}
+
char *Readline(tReadline *Info)
{
char *ret;
char *Readline(tReadline *Info)
{
char *ret;
int len, pos, space = 1023-8-8; // optimised for the heap manager
char ch;
int scrollbackPos = Info->NumHistory;
int len, pos, space = 1023-8-8; // optimised for the heap manager
char ch;
int scrollbackPos = Info->NumHistory;
ret = malloc( space+1 );
if(!ret) return NULL;
len = 0; pos = 0;
ret = malloc( space+1 );
if(!ret) return NULL;
len = 0; pos = 0;
// Read In Command Line
do {
// 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)
{
// Control characters
case '\x1B':
{
// 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 '[':
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
switch(ch)
{
case 'A': // Up
int oldLen = len;
if( scrollbackPos <= 0 ) break;
int oldLen = len;
if( scrollbackPos <= 0 ) break;
+ if(ret != orig) free(ret);
ret = strdup( Info->History[--scrollbackPos] );
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
}
break;
case 'B': // Down
int oldLen = len;
if( scrollbackPos >= Info->NumHistory ) break;
int oldLen = len;
if( scrollbackPos >= Info->NumHistory ) break;
+ if(ret != orig) free(ret);
ret = strdup( Info->History[scrollbackPos++] );
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 --;
}
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++;
break;
case 'C': // Right
if(pos == len) break;
pos++;
- write(_stdout, 3, "\x1B[C");
+ write(STDOUT_FD, 3, "\x1B[C");
// Backspace
case '\b':
if(len <= 0) break; // Protect against underflows
// 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--;
if(pos == len) { // Simple case of end of string
len --;
pos--;
buf[2] += ((len-pos+1)/100) % 10;
buf[3] += ((len-pos+1)/10) % 10;
buf[4] += (len-pos+1) % 10;
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 --;
// Alter Buffer
memmove(&ret[pos-1], &ret[pos], len-pos);
pos --;
// Expand Buffer
if(len+1 > space) {
space += 256;
// 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);
+ }
buf[2] += ((len-pos)/100) % 10;
buf[3] += ((len-pos)/10) % 10;
buf[4] += (len-pos) % 10;
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 {
memmove( &ret[pos+1], &ret[pos], len-pos );
}
else {
- write(_stdout, 1, &ch);
+ write(STDOUT_FD, 1, &ch);
}
ret[pos++] = ch;
len ++;
}
ret[pos++] = ch;
len ++;
// Add to history
if( Info->UseHistory )
{
// 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 ++;
{
void *tmp;
Info->NumHistory ++;
+ if(ret != orig) free(orig);
+
--- /dev/null
+/*
+ * 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