use std::ffi::CStr;
use std::os::raw::c_char;
use crate::symbolic::calculus_of_variations;
use crate::symbolic::core::Expr;
unsafe fn c_str_to_str<'a>(s: *const c_char) -> Option<&'a str> {
unsafe {
if s.is_null() {
None
} else {
CStr::from_ptr(s).to_str().ok()
}
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rssn_euler_lagrange(
lagrangian: *const Expr,
func: *const c_char,
var: *const c_char,
) -> *mut Expr {
unsafe {
if lagrangian.is_null() || func.is_null() || var.is_null() {
return std::ptr::null_mut();
}
let lagrangian_ref = &*lagrangian;
let func_str = match c_str_to_str(func) {
| Some(s) => s,
| None => return std::ptr::null_mut(),
};
let var_str = match c_str_to_str(var) {
| Some(s) => s,
| None => return std::ptr::null_mut(),
};
Box::into_raw(Box::new(calculus_of_variations::euler_lagrange(
lagrangian_ref,
func_str,
var_str,
)))
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rssn_solve_euler_lagrange(
lagrangian: *const Expr,
func: *const c_char,
var: *const c_char,
) -> *mut Expr {
unsafe {
if lagrangian.is_null() || func.is_null() || var.is_null() {
return std::ptr::null_mut();
}
let lagrangian_ref = &*lagrangian;
let func_str = match c_str_to_str(func) {
| Some(s) => s,
| None => return std::ptr::null_mut(),
};
let var_str = match c_str_to_str(var) {
| Some(s) => s,
| None => return std::ptr::null_mut(),
};
Box::into_raw(Box::new(calculus_of_variations::solve_euler_lagrange(
lagrangian_ref,
func_str,
var_str,
)))
}
}
#[unsafe(no_mangle)]
pub unsafe extern "C" fn rssn_hamiltons_principle(
lagrangian: *const Expr,
func: *const c_char,
var: *const c_char,
) -> *mut Expr {
unsafe {
if lagrangian.is_null() || func.is_null() || var.is_null() {
return std::ptr::null_mut();
}
let lagrangian_ref = &*lagrangian;
let func_str = match c_str_to_str(func) {
| Some(s) => s,
| None => return std::ptr::null_mut(),
};
let var_str = match c_str_to_str(var) {
| Some(s) => s,
| None => return std::ptr::null_mut(),
};
Box::into_raw(Box::new(calculus_of_variations::hamiltons_principle(
lagrangian_ref,
func_str,
var_str,
)))
}
}