Usermode/libm - Add hacky INFINITY and NAN macros
[tpg/acess2.git] / Usermode / Libraries / libreadline.so_src / main.c
index 1408eef..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
@@ -80,7 +82,7 @@ char *Readline_NonBlock(tReadline *Info)
         int    len, i;
        
        // Read as much as possible (appending to remaining data)
-       len = read(STDIN_FD, Info->ReadBuffer, READ_BUFFER_SIZE - 1 - Info->ReadBufferLen);
+       len = _SysRead(STDIN_FD, Info->ReadBuffer, READ_BUFFER_SIZE - 1 - Info->ReadBufferLen);
        if( len <= 0 )  return NULL;
        Info->ReadBuffer[Info->ReadBufferLen + len] = '\0';
        
@@ -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;
 }
 
@@ -204,21 +215,21 @@ int Readline_int_ParseCharacter(tReadline *Info, char *Input)
                                        
                                        // Move to the beginning of the line
                                        pos = oldLen;
-                                       while(pos--)    write(STDOUT_FD, "\x1B[D", 3);
+                                       while(pos--)    _SysWrite(STDOUT_FD, "\x1B[D", 3);
                                        
                                        // Update state
                                        Info->CurBuffer = Info->History[--Info->HistoryPos];
                                        Info->BufferSize = Info->BufferUsed = strlen(Info->CurBuffer);
                                        
-                                       write(STDOUT_FD, Info->CurBuffer, Info->BufferUsed);
+                                       _SysWrite(STDOUT_FD, Info->CurBuffer, Info->BufferUsed);
                                        Info->BufferWritePos = Info->BufferUsed;
                                        
                                        // Clear old characters (if needed)
                                        if( oldLen > Info->BufferWritePos ) {
                                                pos = oldLen - Info->BufferWritePos;
-                                               while(pos--)    write(STDOUT_FD, " ", 1);
+                                               while(pos--)    _SysWrite(STDOUT_FD, " ", 1);
                                                pos = oldLen - Info->BufferWritePos;
-                                               while(pos--)    write(STDOUT_FD, "\x1B[D", 3);
+                                               while(pos--)    _SysWrite(STDOUT_FD, "\x1B[D", 3);
                                        }
                                }
                                break;
@@ -230,36 +241,40 @@ int Readline_int_ParseCharacter(tReadline *Info, char *Input)
                                        
                                        // Move to the beginning of the line
                                        pos = oldLen;
-                                       while(pos--)    write(STDOUT_FD, "\x1B[D", 3);
+                                       while(pos--)    _SysWrite(STDOUT_FD, "\x1B[D", 3);
                                        
                                        // Update state
                                        Info->CurBuffer = Info->History[Info->HistoryPos++];
                                        Info->BufferSize = Info->BufferUsed = strlen(Info->CurBuffer);
                                        
                                        // Write new line
-                                       write(STDOUT_FD, Info->CurBuffer, Info->BufferUsed);
+                                       _SysWrite(STDOUT_FD, Info->CurBuffer, Info->BufferUsed);
                                        Info->BufferWritePos = Info->BufferUsed;
                                        
                                        // Clear old characters (if needed)
                                        if( oldLen > Info->BufferWritePos ) {
                                                pos = oldLen - Info->BufferWritePos;
-                                               while(pos--)    write(STDOUT_FD, " ", 1);
+                                               while(pos--)    _SysWrite(STDOUT_FD, " ", 1);
                                                pos = oldLen - Info->BufferWritePos;
-                                               while(pos--)    write(STDOUT_FD, "\x1B[D", 3);
+                                               while(pos--)    _SysWrite(STDOUT_FD, "\x1B[D", 3);
                                        }
                                }
                                break;
                        case 'D':       // Left
                                if(Info->BufferWritePos == 0)   break;
                                Info->BufferWritePos --;
-                               write(STDOUT_FD, "\x1B[D", 3);
+                               _SysWrite(STDOUT_FD, "\x1B[D", 3);
                                break;
                        case 'C':       // Right
                                if(Info->BufferWritePos == Info->BufferUsed)    break;
                                Info->BufferWritePos ++;
-                               write(STDOUT_FD, "\x1B[C", 3);
+                               _SysWrite(STDOUT_FD, "\x1B[C", 3);
                                break;
                        }
+                       break;
+               case '\0':
+                       ofs --;
+                       break;
                }
                break;
        
@@ -267,7 +282,7 @@ int Readline_int_ParseCharacter(tReadline *Info, char *Input)
        case '\b':
                if(Info->BufferWritePos <= 0)   break;  // Protect against underflows
                // Write the backsapce
-               write(STDOUT_FD, &ch, 1);
+               _SysWrite(STDOUT_FD, "\b \b", 3);
                if(Info->BufferWritePos == Info->BufferUsed)    // Simple case: End of string
                {
                        Info->BufferUsed --;
@@ -282,12 +297,12 @@ int Readline_int_ParseCharacter(tReadline *Info, char *Input)
                        buf[3] += (delta/10) % 10;
                        buf[4] += (delta) % 10;
                        // Write everything save for the deleted character
-                       write(STDOUT_FD,
+                       _SysWrite(STDOUT_FD,
                                &Info->CurBuffer[Info->BufferWritePos],
                                Info->BufferUsed - Info->BufferWritePos
                                );
-                       ch = ' ';       write(STDOUT_FD, &ch, 1);       ch = '\b';      // Clear old last character
-                       write(STDOUT_FD, buf, 7);       // Update Cursor
+                       ch = ' ';       _SysWrite(STDOUT_FD, &ch, 1);   ch = '\b';      // Clear old last character
+                       _SysWrite(STDOUT_FD, buf, 7);   // Update Cursor
                        // Alter Buffer
                        memmove(&Info->CurBuffer[Info->BufferWritePos-1],
                                &Info->CurBuffer[Info->BufferWritePos],
@@ -321,12 +336,12 @@ int Readline_int_ParseCharacter(tReadline *Info, char *Input)
                        buf[2] += (delta/100) % 10;
                        buf[3] += (delta/10) % 10;
                        buf[4] += (delta) % 10;
-                       write(STDOUT_FD, &ch, 1);       // Print new character
-                       write(STDOUT_FD,
+                       _SysWrite(STDOUT_FD, &ch, 1);   // Print new character
+                       _SysWrite(STDOUT_FD,
                                &Info->CurBuffer[Info->BufferWritePos],
                                Info->BufferUsed - Info->BufferWritePos
                                );
-                       write(STDOUT_FD, buf, 7);       // Update Cursor
+                       _SysWrite(STDOUT_FD, buf, 7);   // Update Cursor
                        // Move buffer right
                        memmove(
                                &Info->CurBuffer[Info->BufferWritePos+1],
@@ -336,7 +351,7 @@ int Readline_int_ParseCharacter(tReadline *Info, char *Input)
                }
                // Simple append
                else {
-                       write(STDOUT_FD, &ch, 1);
+                       _SysWrite(STDOUT_FD, &ch, 1);
                }
                Info->CurBuffer[ Info->BufferWritePos ++ ] = ch;
                Info->BufferUsed ++;

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