Get raw mode sorted out
This commit is contained in:
parent
8522d9fb33
commit
08cf93b9c7
28
kilo
28
kilo
@ -3,14 +3,9 @@
|
|||||||
|
|
||||||
namespace Kilo;
|
namespace Kilo;
|
||||||
|
|
||||||
use FFI;
|
|
||||||
|
|
||||||
require_once __DIR__ . '/src/constants.php';
|
require_once __DIR__ . '/src/constants.php';
|
||||||
require_once __DIR__ . '/src/functions.php';
|
require_once __DIR__ . '/src/functions.php';
|
||||||
|
|
||||||
$ffi = FFI::load(__DIR__ . '/src/ffi.h');
|
|
||||||
$original_termios = $ffi->new("struct termios");
|
|
||||||
|
|
||||||
function main(): int
|
function main(): int
|
||||||
{
|
{
|
||||||
global $ffi;
|
global $ffi;
|
||||||
@ -18,19 +13,30 @@ function main(): int
|
|||||||
enableRawMode();
|
enableRawMode();
|
||||||
|
|
||||||
// Input Loop
|
// Input Loop
|
||||||
do
|
while (true)
|
||||||
{
|
{
|
||||||
$input = read_stdin();
|
$char = read_stdin(1);
|
||||||
if ($ffi->iscntrl($input))
|
$c = ord($char);
|
||||||
|
|
||||||
|
if (empty($char))
|
||||||
{
|
{
|
||||||
printf("%d\n", $input);
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($ffi->iscntrl($c))
|
||||||
|
{
|
||||||
|
printf("%d\r\n", $c);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
printf("%d ('%c')\n", $input, $input);
|
printf("%d ('%c')\r\n", $c, $c);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ($char === 'q')
|
||||||
|
{
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
while ($input !== 'q');
|
|
||||||
|
|
||||||
disableRawMode();
|
disableRawMode();
|
||||||
|
|
||||||
|
@ -3,6 +3,8 @@
|
|||||||
namespace Kilo;
|
namespace Kilo;
|
||||||
|
|
||||||
define('STDIN_FILENO', 0);
|
define('STDIN_FILENO', 0);
|
||||||
|
define('STDOUT_FILENO', 1);
|
||||||
|
define('STDERR_FILENO', 2);
|
||||||
define('TCSAFLUSH', 2);
|
define('TCSAFLUSH', 2);
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------
|
||||||
|
@ -4,20 +4,24 @@ namespace Kilo;
|
|||||||
|
|
||||||
use FFI;
|
use FFI;
|
||||||
|
|
||||||
// require_once 'constants.php';
|
$ffi = FFI::load(__DIR__ . '/ffi.h');
|
||||||
|
$original_termios = $ffi->new('struct termios');
|
||||||
|
|
||||||
function enableRawMode(): void
|
function enableRawMode(): void
|
||||||
{
|
{
|
||||||
global $ffi;
|
global $ffi;
|
||||||
global $original_termios;
|
global $original_termios;
|
||||||
|
|
||||||
|
|
||||||
// Populate the original terminal settings
|
// Populate the original terminal settings
|
||||||
$ffi->tcgetattr(STDIN_FILENO, FFI::addr($original_termios));
|
$ffi->tcgetattr(STDIN_FILENO, FFI::addr($original_termios));
|
||||||
|
|
||||||
$termios = clone $original_termios;
|
$termios = $ffi->new('struct termios');
|
||||||
|
$termios->c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
|
||||||
$termios->c_lflag &= ~(_ECHO | ICANON);
|
$termios->c_oflag &= ~(OPOST);
|
||||||
|
$termios->c_cflag |= (CS8);
|
||||||
|
$termios->c_lflag &= ~(_ECHO | ICANON | IEXTEN | ISIG);
|
||||||
|
$termios->c_cc[VMIN] = 0;
|
||||||
|
$termios->c_cc[VTIME] = 1;
|
||||||
|
|
||||||
// Turn on raw mode
|
// Turn on raw mode
|
||||||
$ffi->tcsetattr(STDIN_FILENO, TCSAFLUSH, FFI::addr($termios));
|
$ffi->tcsetattr(STDIN_FILENO, TCSAFLUSH, FFI::addr($termios));
|
||||||
@ -31,9 +35,12 @@ function disableRawMode(): void
|
|||||||
$ffi->tcsetattr(STDIN_FILENO, TCSAFLUSH, FFI::addr($original_termios));
|
$ffi->tcsetattr(STDIN_FILENO, TCSAFLUSH, FFI::addr($original_termios));
|
||||||
}
|
}
|
||||||
|
|
||||||
function read_stdin() {
|
function read_stdin(int $len = 128): string
|
||||||
$handle = fopen('php://stdin', 'r');
|
{
|
||||||
$input = rtrim(fgets($handle, 128));
|
$handle = fopen('php://stdin', 'rb');
|
||||||
|
$input = fread($handle, $len);
|
||||||
|
|
||||||
|
$input = rtrim($input);
|
||||||
fclose($handle);
|
fclose($handle);
|
||||||
|
|
||||||
return $input;
|
return $input;
|
||||||
|
Loading…
Reference in New Issue
Block a user