Compare commits

..

3 Commits

Author SHA1 Message Date
R. Eric Wheeler cf7da6c32c Fix name in composer 2024-07-18 13:19:21 -07:00
R. Eric Wheeler 48420375b4 Updated header comment 2024-07-18 12:44:34 -07:00
R. Eric Wheeler d9af97eab2 Update dependencies 2024-07-18 12:34:40 -07:00
14 changed files with 2779 additions and 2729 deletions

1
.gitignore vendored
View File

@ -3,3 +3,4 @@
.php_cs.cache .php_cs.cache
vendor/ vendor/
.phpunit.cache/ .phpunit.cache/
tools/php-cs-fixer/vendor/

18
.php-cs-fixer.dist.php Normal file
View File

@ -0,0 +1,18 @@
<?php
use PhpCsFixer\Config;
$header = file_exists(__DIR__.'/header.txt') ? file_get_contents(__DIR__.'/header.txt') : '';
$finder = PhpCsFixer\Finder::create()
->in(__DIR__ . '/src')
->in(__DIR__ . '/tests')
;
return (new Config())
->setRules([
'@Symfony' => true,
'array_syntax' => ['syntax' => 'short'],
'header_comment' => ['header' => $header],
])
->setFinder($finder)
;

View File

@ -1,14 +0,0 @@
<?php
$finder = PhpCsFixer\Finder::create()
->in(__DIR__)
->exclude('var')
;
return PhpCsFixer\Config::create()
->setRules([
'@Symfony' => true,
'array_syntax' => ['syntax' => 'short'],
])
->setFinder($finder)
;

View File

@ -1,15 +1,13 @@
{ {
"name": "sikofitt/getch", "name": "olivebbs/getch",
"description": "Implements _getch and _ungetch for windows and linux using ffi", "description": "Implements _getch and _ungetch for windows and linux using ffi",
"type": "library", "type": "library",
"require": { "require": {
"php": ">=7.4", "php": "^8.2",
"ext-ffi": "*" "ext-ffi": "*"
}, },
"require-dev": { "require-dev": {
"friendsofphp/php-cs-fixer": "^2.18", "phpunit/phpunit": "^9.6"
"jetbrains/phpstorm-stubs": "dev-master",
"phpunit/phpunit": "^9.5"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {

2843
composer.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -3,7 +3,7 @@
declare(strict_types=1); declare(strict_types=1);
/* /*
* Copyright (c) 2020 https://rewiv.com sikofitt@gmail.com * Copyright (c) 2020-2024 https://sikofitt.com sikofitt@gmail.com
* *
* This Source Code Form is subject to the * This Source Code Form is subject to the
* terms of the Mozilla Public License, v. 2.0. * terms of the Mozilla Public License, v. 2.0.
@ -15,19 +15,15 @@ declare(strict_types=1);
use Sikofitt\Console\Getch; use Sikofitt\Console\Getch;
if (!function_exists('getch')) { if (!function_exists('getch')) {
function getch(string $linuxLibrary = null): int function getch(?string $linuxLibrary = null): int
{ {
$g = new Getch($linuxLibrary); return (new Getch($linuxLibrary))->getch();
return $g->getch();
} }
} }
if (!function_exists('ungetch')) { if (!function_exists('ungetch')) {
function ungetch($char, string $linuxLibrary = null): int function ungetch($char, ?string $linuxLibrary = null): int
{ {
$g = new Getch($linuxLibrary); return (new Getch($linuxLibrary))->ungetch($char);
return $g->ungetch($char);
} }
} }

View File

@ -1,4 +1,4 @@
Copyright (c) 2020 https://rewiv.com sikofitt@gmail.com Copyright (c) 2020-2024 https://sikofitt.com sikofitt@gmail.com
This Source Code Form is subject to the This Source Code Form is subject to the
terms of the Mozilla Public License, v. 2.0. terms of the Mozilla Public License, v. 2.0.

View File

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?> <?xml version="1.0" encoding="UTF-8"?>
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.5/phpunit.xsd" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.6/phpunit.xsd"
bootstrap="vendor/autoload.php" bootstrap="vendor/autoload.php"
cacheResultFile=".phpunit.cache/test-results" cacheResultFile=".phpunit.cache/test-results"
executionOrder="depends,defects" executionOrder="depends,defects"

View File

@ -3,7 +3,7 @@
declare(strict_types=1); declare(strict_types=1);
/* /*
* Copyright (c) 2020 https://rewiv.com sikofitt@gmail.com * Copyright (c) 2020-2024 https://sikofitt.com sikofitt@gmail.com
* *
* This Source Code Form is subject to the * This Source Code Form is subject to the
* terms of the Mozilla Public License, v. 2.0. * terms of the Mozilla Public License, v. 2.0.
@ -14,9 +14,6 @@ declare(strict_types=1);
namespace Sikofitt\Console; namespace Sikofitt\Console;
use FFI;
use RuntimeException;
final class Getch final class Getch
{ {
// Special key codes // Special key codes
@ -25,7 +22,7 @@ final class Getch
public const KEY_E0 = 0; public const KEY_E0 = 0;
public const KEY_E1 = 224; public const KEY_E1 = 224;
// Supported scan scodes. // Supported scan codes.
public const KEY_F1 = 59; public const KEY_F1 = 59;
public const KEY_F2 = 60; public const KEY_F2 = 60;
public const KEY_F3 = 61; public const KEY_F3 = 61;
@ -56,14 +53,14 @@ final class Getch
int _ungetch(int c); int _ungetch(int c);
DECLARATIONS; DECLARATIONS;
private static ?FFI $ffi = null; private static ?\FFI $ffi = null;
public static function resetFFI(): void public static function resetFFI(): void
{ {
static::$ffi = null; self::$ffi = null;
} }
public function __construct(string $linuxLibrary = null) public function __construct(?string $linuxLibrary = null)
{ {
if (null === $linuxLibrary) { if (null === $linuxLibrary) {
$linuxLibrary = self::LINUX_LIBRARY; $linuxLibrary = self::LINUX_LIBRARY;
@ -73,15 +70,15 @@ final class Getch
$osFamily = PHP_OS_FAMILY; $osFamily = PHP_OS_FAMILY;
if ('Windows' === $osFamily) { if ('Windows' === $osFamily) {
$declarations = self::DECLARATIONS.' int _kbhit();'; $declarations = self::DECLARATIONS.' int _kbhit();';
self::$ffi = FFI::cdef($declarations, self::WINDOWS_LIBRARY); self::$ffi = \FFI::cdef($declarations, self::WINDOWS_LIBRARY);
} elseif ('Linux' === $osFamily) { } elseif ('Linux' === $osFamily) {
if (!file_exists($linuxLibrary)) { if (!file_exists($linuxLibrary)) {
throw new RuntimeException(sprintf('Could not find library file %s.', $linuxLibrary)); throw new \RuntimeException(sprintf('Could not find library file %s.', $linuxLibrary));
} }
$declarations = self::DECLARATIONS.' int cinPeek();'; $declarations = self::DECLARATIONS.' int cinPeek();';
self::$ffi = FFI::cdef($declarations, $linuxLibrary); self::$ffi = \FFI::cdef($declarations, $linuxLibrary);
} else { } else {
throw new RuntimeException(sprintf('Sorry, %s is not supported yet.', $osFamily)); throw new \RuntimeException(sprintf('Sorry, %s is not supported yet.', $osFamily));
} }
} }
} }
@ -89,9 +86,9 @@ final class Getch
public function peek(): int public function peek(): int
{ {
if (PHP_OS_FAMILY === 'Windows') { if (PHP_OS_FAMILY === 'Windows') {
if ($ffi->_kbhit()) { if (self::$ffi->_kbhit()) {
$result = $ffi->_getch(); $result = self::$ffi->_getch();
$ffi->_ungetch($result); self::$ffi->_ungetch($result);
return $result; return $result;
} }
@ -99,7 +96,7 @@ final class Getch
return -1; return -1;
} }
return $ffi->cinPeek(); return self::$ffi->cinPeek();
} }
public function getch(): int public function getch(): int
@ -107,12 +104,8 @@ final class Getch
return self::$ffi->_getch(); return self::$ffi->_getch();
} }
public function ungetch($char): int public function ungetch(string|int $char): int
{ {
if (!is_string($char) && !is_int($char)) {
throw new \TypeError('ungetch takes a parameter of int or string.');
}
if (is_string($char)) { if (is_string($char)) {
$char = ord($char[0]); $char = ord($char[0]);
} }

0
src/Console/Resources/libgetch.so Executable file → Normal file
View File

View File

@ -1,5 +1,15 @@
<?php <?php
/*
* Copyright (c) 2020-2024 https://sikofitt.com sikofitt@gmail.com
*
* This Source Code Form is subject to the
* terms of the Mozilla Public License, v. 2.0.
*
* If a copy of the MPL was not distributed with this file,
* You can obtain one at https://mozilla.org/MPL/2.0/.
*/
namespace Sikofitt\Tests\Console\Getch; namespace Sikofitt\Tests\Console\Getch;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
@ -23,7 +33,9 @@ class GetchTest extends TestCase
/** /**
* @preserveGlobalState disabled * @preserveGlobalState disabled
*
* @backupStaticAttributes false * @backupStaticAttributes false
*
* @backupGlobals false * @backupGlobals false
*/ */
public function testFailureOnInvalidLibrary() public function testFailureOnInvalidLibrary()

View File

@ -1,5 +1,15 @@
<?php <?php
/*
* Copyright (c) 2020-2024 https://sikofitt.com sikofitt@gmail.com
*
* This Source Code Form is subject to the
* terms of the Mozilla Public License, v. 2.0.
*
* If a copy of the MPL was not distributed with this file,
* You can obtain one at https://mozilla.org/MPL/2.0/.
*/
namespace Sikofitt\Tests\Console\Ungetch; namespace Sikofitt\Tests\Console\Ungetch;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;

View File

@ -0,0 +1,5 @@
{
"require-dev": {
"friendsofphp/php-cs-fixer": "^3.59"
}
}

2542
tools/php-cs-fixer/composer.lock generated Normal file

File diff suppressed because it is too large Load Diff