Compare commits

..

No commits in common. "a278fd640096cd9ada7f455fb57b9ff51dc4b19d" and "fead8bbbbc1bcd011483ce64c5b4e95f1dc779ba" have entirely different histories.

15 changed files with 4286 additions and 2620 deletions

1
.gitignore vendored
View File

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

View File

@ -1,18 +0,0 @@
<?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)
;

14
.php_cs.dist Normal file
View File

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

View File

@ -2,6 +2,10 @@
This simply uses the FFI extension to enable _getch and _ungetch in Windows and linux. This simply uses the FFI extension to enable _getch and _ungetch in Windows and linux.
[![Pipeline status](https://code.bgemi.net/olive/PHP/getch/badges/1.x/pipeline.svg)](https://code.bgemi.net/olive/PHP/getch/-/commits/1.x)
[![Coverage report](https://code.bgemi.net/olive/PHP/getch/badges/1.x/coverage.svg)](https://code.bgemi.net/olive/PHP/getch/-/commits/1.x)
[![Latest Release](https://code.bgemi.net/olive/PHP/getch/-/badges/release.svg)](https://code.bgemi.net/olive/PHP/getch/-/releases)
```shell script ```shell script
$ composer require olivebbs/getch $ composer require olivebbs/getch
``` ```

View File

@ -1,17 +1,19 @@
{ {
"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",
"keywords": ["getch", "windows", "conio", "linux", "console", "conio.h", "hotkey", "termios"],
"require": { "require": {
"php": "^8.2", "php": ">=7.4",
"ext-ffi": "*" "ext-ffi": "*"
}, },
"require-dev": { "require-dev": {
"phpunit/phpunit": "^9.6" "friendsofphp/php-cs-fixer": "^2.18",
"phpunit/phpunit": "^9.5"
}, },
"autoload": { "autoload": {
"psr-4": { "psr-4": {
"Sikofitt\\Console\\": "src/Console/" "Olive\\Console\\": "src/Console/"
}, },
"files": [ "files": [
"functions.php" "functions.php"
@ -19,7 +21,7 @@
}, },
"autoload-dev": { "autoload-dev": {
"psr-4": { "psr-4": {
"Sikofitt\\Tests\\Console\\": "tests/" "Olive\\Tests\\Console\\": "tests/"
} }
}, },
"license": "MPL-2.0", "license": "MPL-2.0",
@ -28,5 +30,8 @@
"name": "R. Eric Wheeler", "name": "R. Eric Wheeler",
"email": "sikofitt@gmail.com" "email": "sikofitt@gmail.com"
} }
] ],
"conflict": {
"sikofitt/getch": "*"
}
} }

4220
composer.lock generated Normal file

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-2024 https://sikofitt.com sikofitt@gmail.com * Copyright (c) 2020 https://rewiv.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,15 +15,19 @@ declare(strict_types=1);
use Olive\Console\Getch; use Olive\Console\Getch;
if (!function_exists('getch')) { if (!function_exists('getch')) {
function getch(?string $linuxLibrary = null): int function getch(string $linuxLibrary = null): int
{ {
return (new Getch($linuxLibrary))->getch(); $g = new Getch($linuxLibrary);
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
{ {
return (new Getch($linuxLibrary))->ungetch($char); $g = new Getch($linuxLibrary);
return $g->ungetch($char);
} }
} }

View File

@ -1,4 +1,4 @@
Copyright (c) 2020-2024 https://sikofitt.com sikofitt@gmail.com Copyright (c) 2020 https://rewiv.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.6/phpunit.xsd" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/9.5/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-2024 https://sikofitt.com sikofitt@gmail.com * Copyright (c) 2020 https://rewiv.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.
@ -12,7 +12,10 @@ declare(strict_types=1);
* You can obtain one at https://mozilla.org/MPL/2.0/. * You can obtain one at https://mozilla.org/MPL/2.0/.
*/ */
namespace Sikofitt\Console; namespace Olive\Console;
use FFI;
use RuntimeException;
final class Getch final class Getch
{ {
@ -22,7 +25,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 codes. // Supported scan scodes.
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;
@ -53,14 +56,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
{ {
self::$ffi = null; static::$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;
@ -70,15 +73,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));
} }
} }
} }
@ -86,9 +89,9 @@ final class Getch
public function peek(): int public function peek(): int
{ {
if (PHP_OS_FAMILY === 'Windows') { if (PHP_OS_FAMILY === 'Windows') {
if (self::$ffi->_kbhit()) { if ($ffi->_kbhit()) {
$result = self::$ffi->_getch(); $result = $ffi->_getch();
self::$ffi->_ungetch($result); $ffi->_ungetch($result);
return $result; return $result;
} }
@ -96,7 +99,7 @@ final class Getch
return -1; return -1;
} }
return self::$ffi->cinPeek(); return $ffi->cinPeek();
} }
public function getch(): int public function getch(): int
@ -104,8 +107,12 @@ final class Getch
return self::$ffi->_getch(); return self::$ffi->_getch();
} }
public function ungetch(string|int $char): int public function ungetch($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 Normal file → Executable file
View File

View File

@ -1,19 +1,9 @@
<?php <?php
/* namespace Olive\Tests\Console\Getch;
* 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;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Sikofitt\Console\Getch; use Olive\Console\Getch;
class GetchTest extends TestCase class GetchTest extends TestCase
{ {
@ -33,9 +23,7 @@ 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,19 +1,9 @@
<?php <?php
/* namespace Olive\Tests\Console\Ungetch;
* 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;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Sikofitt\Console\Getch; use Olive\Console\Getch;
class UngetchTest extends TestCase class UngetchTest extends TestCase
{ {

View File

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

File diff suppressed because it is too large Load Diff