*/
#include <readline.h>
#include <acess/sys.h>
+#include <acess/devices/pty.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int len, i;
// Read as much as possible (appending to remaining data)
- len = read(STDIN_FD, READ_BUFFER_SIZE - 1 - Info->ReadBufferLen, Info->ReadBuffer);
+ len = _SysRead(STDIN_FD, Info->ReadBuffer, READ_BUFFER_SIZE - 1 - Info->ReadBufferLen);
+ if( len <= 0 ) return NULL;
Info->ReadBuffer[Info->ReadBufferLen + len] = '\0';
// Parse the data we have
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)) );
-
+
+ // stty +echo,canon
+ mode.InputMode = PTYIMODE_CANON|PTYIMODE_ECHO;
+ _SysIOCtl(STDIN_FD, PTY_IOCTL_SETMODE, &mode);
+
return ret;
}
if(ch == '\n')
{
- printf("\n");
+// printf("\n");
if(Info->CurBuffer)
{
// Cap String
// Move to the beginning of the line
pos = oldLen;
- while(pos--) write(STDOUT_FD, 3, "\x1B[D");
+ 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->BufferUsed, Info->CurBuffer);
+ _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, 3, "\x1B[D");
+ while(pos--) _SysWrite(STDOUT_FD, "\x1B[D", 3);
}
}
break;
// Move to the beginning of the line
pos = oldLen;
- while(pos--) write(STDOUT_FD, 3, "\x1B[D");
+ 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->BufferUsed, Info->CurBuffer);
+ _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, 3, "\x1B[D");
+ while(pos--) _SysWrite(STDOUT_FD, "\x1B[D", 3);
}
}
break;
case 'D': // Left
if(Info->BufferWritePos == 0) break;
Info->BufferWritePos --;
- write(STDOUT_FD, 3, "\x1B[D");
+ _SysWrite(STDOUT_FD, "\x1B[D", 3);
break;
case 'C': // Right
if(Info->BufferWritePos == Info->BufferUsed) break;
Info->BufferWritePos ++;
- write(STDOUT_FD, 3, "\x1B[C");
+ _SysWrite(STDOUT_FD, "\x1B[C", 3);
break;
}
+ break;
+ case '\0':
+ ofs --;
+ break;
}
break;
case '\b':
if(Info->BufferWritePos <= 0) break; // Protect against underflows
// Write the backsapce
- write(STDOUT_FD, 1, &ch);
+ _SysWrite(STDOUT_FD, &ch, 1);
if(Info->BufferWritePos == Info->BufferUsed) // Simple case: End of string
{
Info->BufferUsed --;
buf[3] += (delta/10) % 10;
buf[4] += (delta) % 10;
// Write everything save for the deleted character
- write(STDOUT_FD,
- Info->BufferUsed - Info->BufferWritePos,
- &Info->CurBuffer[Info->BufferWritePos]
+ _SysWrite(STDOUT_FD,
+ &Info->CurBuffer[Info->BufferWritePos],
+ Info->BufferUsed - Info->BufferWritePos
);
- ch = ' '; write(STDOUT_FD, 1, &ch); ch = '\b'; // Clear old last character
- write(STDOUT_FD, 7, buf); // 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],
buf[2] += (delta/100) % 10;
buf[3] += (delta/10) % 10;
buf[4] += (delta) % 10;
- write(STDOUT_FD, 1, &ch); // Print new character
- write(STDOUT_FD,
- Info->BufferUsed - Info->BufferWritePos,
- &Info->CurBuffer[Info->BufferWritePos]
+ _SysWrite(STDOUT_FD, &ch, 1); // Print new character
+ _SysWrite(STDOUT_FD,
+ &Info->CurBuffer[Info->BufferWritePos],
+ Info->BufferUsed - Info->BufferWritePos
);
- write(STDOUT_FD, 7, buf); // Update Cursor
+ _SysWrite(STDOUT_FD, buf, 7); // Update Cursor
// Move buffer right
memmove(
&Info->CurBuffer[Info->BufferWritePos+1],
}
// Simple append
else {
- write(STDOUT_FD, 1, &ch);
+ _SysWrite(STDOUT_FD, &ch, 1);
}
Info->CurBuffer[ Info->BufferWritePos ++ ] = ch;
Info->BufferUsed ++;