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

php-ffi/scalar-utils

Folders and files

NameName
Last commit message
Last commit date

Latest commit

4bc796c · Jan 1, 2023

History

8 Commits
Jan 1, 2023
Nov 3, 2021
Jan 1, 2023
Jan 1, 2023
Jan 1, 2023
Jan 1, 2023
Jan 1, 2023
Aug 21, 2021
Jan 1, 2023
Jan 1, 2023
Jan 1, 2023
Aug 21, 2021
Aug 21, 2021

Repository files navigation

FFI Scalar Utils

PHP 8.1+ Latest Stable Version Latest Unstable Version Total Downloads License MIT

A set of util methods to interact with PHP and C scalar types.

Requirements

  • PHP >= 7.4
  • ext-ffi

Installation

Library is available as composer repository and can be installed using the following command in a root of your project.

$ composer require ffi/scalar-utils

Usage

PHP To C Marshalling

use FFI\Scalar\Type;

Type::int8(42);                 // object CData<int8_t> { cdata: 42 }
Type::int8Array([1, 2, 3]);     // object CData<int8_t[3]> { cdata: [1, 2, 3] }
Type::uint8(42);                // object CData<uint8_t> { cdata: 42 }
Type::uint8Array([1, 2, 3]);    // object CData<uint8_t[3]> { cdata: [1, 2, 3] }

Type::int16(42);                // object CData<int16_t> { cdata: 42 }
Type::int16Array([1, 2, 3]);    // object CData<int16_t[3]> { cdata: [1, 2, 3] }
Type::uint16(42);               // object CData<uint16_t> { cdata: 42 }
Type::uint16Array([1, 2, 3]);   // object CData<uint16_t[3]> { cdata: [1, 2, 3] }

Type::int32(42);                // object CData<int32_t> { cdata: 42 }
Type::int32Array([1, 2, 3]);    // object CData<int32_t[3]> { cdata: [1, 2, 3] }
Type::uint32(42);               // object CData<uint32_t> { cdata: 42 }
Type::uint32Array([1, 2, 3]);   // object CData<uint32_t[3]> { cdata: [1, 2, 3] }

Type::int64(42);                // object CData<int64_t> { cdata: 42 }
Type::int64Array([1, 2, 3]);    // object CData<int64_t[3]> { cdata: [1, 2, 3] }
Type::uint64(42);               // object CData<uint64_t> { cdata: 42 }
Type::uint64Array([1, 2, 3]);   // object CData<uint64_t[3]> { cdata: [1, 2, 3] }

Type::short(42);                // object CData<signed short int> { cdata: 42 }
Type::shortArray([1, 2, 3]);    // object CData<signed short int[3]> { cdata: [1, 2, 3] }
Type::ushort(42);               // object CData<unsigned short int> { cdata: 42 }
Type::ushortArray([1, 2, 3]);   // object CData<unsigned short int[3]> { cdata: [1, 2, 3] }

Type::int(42);                  // object CData<signed int> { cdata: 42 }
Type::intArray([1, 2, 3]);      // object CData<signed int[3]> { cdata: [1, 2, 3] }
Type::uint(42);                 // object CData<unsigned int> { cdata: 42 }
Type::uintArray([1, 2, 3]);     // object CData<unsigned int[3]> { cdata: [1, 2, 3] }

Type::long(42);                  // object CData<signed long int> { cdata: 42 }
Type::longArray([1, 2, 3]);      // object CData<signed long int[3]> { cdata: [1, 2, 3] }
Type::ulong(42);                 // object CData<unsigned long int> { cdata: 42 }
Type::ulongArray([1, 2, 3]);     // object CData<unsigned long int[3]> { cdata: [1, 2, 3] }

Type::float(42);                    // object CData<float> { cdata: 42.0 }
Type::floatArray([1, 2, 3]);        // object CData<float[3]> { cdata: [1.0, 2.0, 3.0] }

Type::double(42);                   // object CData<double> { cdata: 42.0 }
Type::doubleArray([1, 2, 3]);       // object CData<double[3]> { cdata: [1.0, 2.0, 3.0] }

Type::longDouble(42);               // object CData<long double> { cdata: 42.0 }
Type::longDoubleArray([1, 2, 3]);   // object CData<long double[3]> { cdata: [1.0, 2.0, 3.0] }

Type::bool(true);                       // object CData<bool> { cdata: true }
Type::boolArray([true, false, true]);   // object CData<bool[3]> { cdata: [true, false, true] }

Type::char('c');                    // object CData<char> { cdata: 'c' }
Type::charArray(['a', 'b', 'c']);   // object CData<char[3]> { cdata: ['a', 'b', 'c'] }

Type::string('hi');                 // object CData<char[3]> { cdata: ['h', 'i', '\0'] }
Type::stringArray(['a', 'b']);      // object CData<char[2][2]> { cdata: [['a' '\0'], ['b', '\0']] }

Type::wideString('hi');             // object CData<wchar_t[3]> { cdata: ['h', 'i', '\0\0'] }
Type::wideStringArray(['a', 'b']);  // object CData<wchar_t[2][2]> { cdata: [['a' '\0\0'], ['b', '\0\0']] }

// Direct API
Type::create($ffi->type('example'), $value); // object CData<example> { cdata: ... }
Type::array($ffi->type('example'), [$value]); // object CData<example[1]> { cdata: [ ... ] }

C To PHP Marshalling

use FFI\Scalar\Type;

Type::toString($cdata);     // string(x) "..."
Type::toWideString($cdata); // string(x) "..."
Type::toInt($cdata);        // int(x)
Type::toFloat($cdata);      // float(x)
Type::toBool($cdata);       // bool(x)
Type::toArray($cdata);      // array(...)