Up to step 21
This commit is contained in:
parent
10369accac
commit
e0a9d066ca
29
kilo
29
kilo
@ -5,41 +5,20 @@ namespace Kilo;
|
|||||||
|
|
||||||
require_once __DIR__ . '/src/constants.php';
|
require_once __DIR__ . '/src/constants.php';
|
||||||
require_once __DIR__ . '/src/functions.php';
|
require_once __DIR__ . '/src/functions.php';
|
||||||
|
require_once __DIR__ . '/src/editor.php';
|
||||||
|
|
||||||
function main(): int
|
function main(): int
|
||||||
{
|
{
|
||||||
global $ffi;
|
|
||||||
|
|
||||||
enableRawMode();
|
enableRawMode();
|
||||||
|
|
||||||
|
$editor = new Editor();
|
||||||
|
|
||||||
// Input Loop
|
// Input Loop
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
$char = read_stdin(1);
|
$editor->processKeypress();
|
||||||
$c = ord($char);
|
|
||||||
|
|
||||||
if (empty($char))
|
|
||||||
{
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($ffi->iscntrl($c))
|
|
||||||
{
|
|
||||||
printf("%d\r\n", $c);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf("%d ('%c')\r\n", $c, $c);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($char === 'q')
|
|
||||||
{
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
disableRawMode();
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
27
src/editor.php
Normal file
27
src/editor.php
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
<?php declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Kilo;
|
||||||
|
|
||||||
|
class Editor {
|
||||||
|
public function __construct()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public function processKeypress(): void
|
||||||
|
{
|
||||||
|
$c = $this->readKey();
|
||||||
|
|
||||||
|
switch($c)
|
||||||
|
{
|
||||||
|
case chr(ctrl_key('q')):
|
||||||
|
exit(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected function readKey(): string
|
||||||
|
{
|
||||||
|
return read_stdin(1);
|
||||||
|
}
|
||||||
|
}
|
@ -12,6 +12,8 @@ function enableRawMode(): void
|
|||||||
global $ffi;
|
global $ffi;
|
||||||
global $original_termios;
|
global $original_termios;
|
||||||
|
|
||||||
|
register_shutdown_function('Kilo\\disableRawMode');
|
||||||
|
|
||||||
// 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));
|
||||||
|
|
||||||
@ -44,4 +46,9 @@ function read_stdin(int $len = 128): string
|
|||||||
fclose($handle);
|
fclose($handle);
|
||||||
|
|
||||||
return $input;
|
return $input;
|
||||||
|
}
|
||||||
|
|
||||||
|
function ctrl_key(string $char): int
|
||||||
|
{
|
||||||
|
return ord($char) & 0x1f;
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user