Usermode/libunicode - Add C++ wrappers
[tpg/acess2.git] / Usermode / Libraries / libreadline.so_src / main.c
index 58db03a..5937c6b 100644 (file)
@@ -6,9 +6,11 @@
  */
 #include <readline.h>
 #include <acess/sys.h>
+#include <acess/devices/pty.h>
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
+#include <errno.h>
 
 #define STDIN_FD       0
 #define STDOUT_FD      1
@@ -104,15 +106,24 @@ char *Readline_NonBlock(tReadline *Info)
        }
        
        // Return NULL when command is still being edited
+       errno = EAGAIN;
        return NULL;
 }
 
 char *Readline(tReadline *Info)
 {
        char    *ret;
+
+       // stty -echo,canon
+       struct ptymode  mode = {.InputMode = 0, .OutputMode = 0};
+       _SysIOCtl(STDIN_FD, PTY_IOCTL_SETMODE, &mode);
        
-       while( NULL == (ret = Readline_NonBlock(Info)) );
-       
+       while( NULL == (ret = Readline_NonBlock(Info)) && errno == EAGAIN );
+
+       // stty +echo,canon
+       mode.InputMode = PTYIMODE_CANON|PTYIMODE_ECHO;
+       _SysIOCtl(STDIN_FD, PTY_IOCTL_SETMODE, &mode);
+
        return ret;
 }
 
@@ -271,7 +282,7 @@ int Readline_int_ParseCharacter(tReadline *Info, char *Input)
        case '\b':
                if(Info->BufferWritePos <= 0)   break;  // Protect against underflows
                // Write the backsapce
-               _SysWrite(STDOUT_FD, &ch, 1);
+               _SysWrite(STDOUT_FD, "\b \b", 3);
                if(Info->BufferWritePos == Info->BufferUsed)    // Simple case: End of string
                {
                        Info->BufferUsed --;

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