Skip to content
This repository was archived by the owner on Dec 16, 2024. It is now read-only.

Commit 4896085

Browse files
committed
Improve string and wide string serializer methods
1 parent 273aa6a commit 4896085

File tree

2 files changed

+69
-6
lines changed

2 files changed

+69
-6
lines changed

composer.json

+2-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,8 @@
1919
],
2020
"require": {
2121
"php": ">=7.4",
22-
"ext-ffi": "*"
22+
"ext-ffi": "*",
23+
"ext-mbstring": "*"
2324
},
2425
"autoload": {
2526
"psr-4": {

src/TypeSerializersTrait.php

+67-5
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,72 @@
2020
trait TypeSerializersTrait
2121
{
2222
/**
23-
* @param CData $cdata
23+
* @param CData|\ArrayAccess $cdata
24+
* @param positive-int|null $size
25+
* @return string
26+
*/
27+
public static function toWideString($cdata, int $size = null): string
28+
{
29+
[$i, $result] = [0, ''];
30+
31+
if ($size !== null) {
32+
for ($i = 0; $i < $size; ++$i) {
33+
$char = $cdata[$i];
34+
$result .= \is_int($char) ? \mb_chr($char) : $char;
35+
}
36+
37+
return $result;
38+
}
39+
40+
do {
41+
$char = $cdata[$i];
42+
43+
if ($char === 0 || $char === "\0") {
44+
return $result;
45+
}
46+
47+
$result .= \is_int($char) ? \mb_chr($char) : $char;
48+
} while (++$i);
49+
50+
return $result;
51+
}
52+
53+
54+
/**
55+
* @param CData|\ArrayAccess $cdata
56+
* @param positive-int|null $size
2457
* @return string
2558
*/
26-
public static function toString(CData $cdata): string
59+
public static function toString($cdata, int $size = null): string
2760
{
28-
return \FFI::string(\FFI::cast('char*', $cdata));
61+
assert($size === null || $size > 0, 'Size value must be greater that 0');
62+
63+
if ($cdata instanceof CData) {
64+
return \FFI::string(\FFI::cast('char*', $cdata), $size);
65+
}
66+
67+
[$i, $result] = [0, ''];
68+
69+
if ($size !== null) {
70+
for ($i = 0; $i < $size; ++$i) {
71+
$char = $cdata[$i];
72+
$result .= \is_int($char) ? \chr($char) : $char;
73+
}
74+
75+
return $result;
76+
}
77+
78+
do {
79+
$char = $cdata[$i];
80+
81+
if ($char === 0 || $char === "\0") {
82+
return $result;
83+
}
84+
85+
$result .= \is_int($char) ? \chr($char) : $char;
86+
} while (++$i);
87+
88+
return $result;
2989
}
3090

3191
/**
@@ -56,12 +116,14 @@ public static function toBool(CData $cdata): bool
56116
}
57117

58118
/**
59-
* @param CData $array
119+
* @param CData|iterable $array
60120
* @param positive-int|null $size
61121
* @return array
62122
*/
63-
public static function toArray(CData $array, int $size = null): array
123+
public static function toArray($array, int $size = null): array
64124
{
125+
assert($size === null || $size > 0, 'Size value must be greater that 0');
126+
65127
$data = [];
66128

67129
if ($size === null) {

0 commit comments

Comments
 (0)