82 lines
2.0 KiB
PHP
82 lines
2.0 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace Arboricx;
|
|
|
|
require __DIR__ . '/ffi.php';
|
|
|
|
use function Arboricx\{ctx_init, ctx_free, loadBundleDefault, ofNumber, ofString, app, reduce, toString, toBool, toNumber};
|
|
|
|
function findLib(): string
|
|
{
|
|
$env = getenv('ARBORICX_LIB');
|
|
if ($env !== false && file_exists($env)) {
|
|
return $env;
|
|
}
|
|
|
|
$paths = [
|
|
__DIR__ . '/../../zig/zig-out/lib/libarboricx.so',
|
|
__DIR__ . '/../libarboricx.so',
|
|
'/usr/local/lib/libarboricx.so',
|
|
'/usr/lib/libarboricx.so',
|
|
'./libarboricx.so',
|
|
];
|
|
foreach ($paths as $p) {
|
|
if (file_exists($p)) {
|
|
return $p;
|
|
}
|
|
}
|
|
|
|
throw new \RuntimeException('libarboricx.so not found. Set ARBORICX_LIB to its full path.');
|
|
}
|
|
|
|
function decode(\FFI\CData $ctx, int $root): string
|
|
{
|
|
try {
|
|
return toBool($ctx, $root) ? 'true' : 'false';
|
|
} catch (\Throwable $e) {
|
|
try {
|
|
return toString($ctx, $root);
|
|
} catch (\Throwable $e2) {
|
|
try {
|
|
return (string) toNumber($ctx, $root);
|
|
} catch (\Throwable $e3) {
|
|
throw new \RuntimeException('could not decode result');
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function decodeType(\FFI\CData $ctx, int $root): string
|
|
{
|
|
try {
|
|
toBool($ctx, $root);
|
|
return 'bool';
|
|
} catch (\Throwable $e) {
|
|
try {
|
|
toString($ctx, $root);
|
|
return 'string';
|
|
} catch (\Throwable $e2) {
|
|
try {
|
|
toNumber($ctx, $root);
|
|
return 'number';
|
|
} catch (\Throwable $e3) {
|
|
return 'unknown (raw tree)';
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
function readBundle(string $path): string
|
|
{
|
|
if (!file_exists($path)) {
|
|
throw new \RuntimeException("bundle not found: $path");
|
|
}
|
|
$bytes = file_get_contents($path);
|
|
if ($bytes === false) {
|
|
throw new \RuntimeException("could not read bundle: $path");
|
|
}
|
|
return $bytes;
|
|
}
|