ripht-php-sapi 0.1.0-rc.9

Ripht PHP SAPI - A PHP SAPI written in Rust to expose safe and convenient APIs to encourage additional Rust tooling development for PHP
Documentation
use std::os::raw::{c_char, c_void};

use super::ffi::{self, zend_function_entry, zval};

unsafe extern "C" fn zif_dory_rust_ping(
    _execute_data: *mut c_void,
    return_value: *mut zval,
) {
    (*return_value).set_string(ffi::zend_string_init_rust(b"pong"));
}

#[repr(C)]
struct ArgInfoHeader {
    name: *const c_char,
    type_info: [u8; 16],
    default_value: *const c_char,
}

unsafe impl Sync for ArgInfoHeader {}

static ARGINFO_0: [ArgInfoHeader; 1] = [ArgInfoHeader {
    name: 0usize as *const c_char,
    type_info: [0; 16],
    default_value: std::ptr::null(),
}];

macro_rules! func_entry {
    ($name:expr, $handler:expr, $arginfo:expr, $num_args:expr) => {
        zend_function_entry {
            fname: $name.as_ptr() as *const c_char,
            handler: Some($handler),
            arg_info: $arginfo.as_ptr() as *const c_void,
            num_args: $num_args,
            flags: 0,
            frameless_function_infos: std::ptr::null(),
            doc_comment: std::ptr::null(),
        }
    };
}

pub fn entries() -> &'static [zend_function_entry] {
    static ENTRIES: [zend_function_entry; 2] = [
        func_entry!(b"dory_rust_ping\0", zif_dory_rust_ping, ARGINFO_0, 0),
        zend_function_entry::end(),
    ];

    &ENTRIES
}