X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FLibraries%2Flibreadline.so_src%2Fmain.c;h=5937c6bd3d25cb59edc3d827099f067684fea136;hb=6afcf1f9b14d9ad0111daea549cb0db5bf7f9009;hp=1408eef706723ee8f58dbe4f6081def06a6ad3b2;hpb=6c7e82169e66197939b83945812b02787ed0f52e;p=tpg%2Facess2.git diff --git a/Usermode/Libraries/libreadline.so_src/main.c b/Usermode/Libraries/libreadline.so_src/main.c index 1408eef7..5937c6bd 100644 --- a/Usermode/Libraries/libreadline.so_src/main.c +++ b/Usermode/Libraries/libreadline.so_src/main.c @@ -6,9 +6,11 @@ */ #include #include +#include #include #include #include +#include #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 ++;