#![allow(unsafe_code, clippy::missing_safety_doc)]
use std::ffi::CStr;
use std::os::raw::c_char;
use crate::serial::SerializeOptions;
use crate::tree::Document;
use super::strings::to_c_string;
use super::{clear_last_error, set_last_error};
#[no_mangle]
pub unsafe extern "C" fn xmloxide_serialize(doc: *const Document) -> *mut c_char {
clear_last_error();
if doc.is_null() {
set_last_error("null document pointer");
return std::ptr::null_mut();
}
let doc = unsafe { &*doc };
let output = crate::serial::serialize(doc);
to_c_string(&output)
}
#[no_mangle]
pub unsafe extern "C" fn xmloxide_serialize_pretty(doc: *const Document) -> *mut c_char {
clear_last_error();
if doc.is_null() {
set_last_error("null document pointer");
return std::ptr::null_mut();
}
let doc = unsafe { &*doc };
let opts = SerializeOptions::default().indent(true);
let output = crate::serial::serialize_with_options(doc, &opts);
to_c_string(&output)
}
#[no_mangle]
pub unsafe extern "C" fn xmloxide_serialize_pretty_custom(
doc: *const Document,
indent_str: *const c_char,
) -> *mut c_char {
clear_last_error();
if doc.is_null() {
set_last_error("null document pointer");
return std::ptr::null_mut();
}
if indent_str.is_null() {
set_last_error("null indent_str pointer");
return std::ptr::null_mut();
}
let doc = unsafe { &*doc };
let c_indent = unsafe { CStr::from_ptr(indent_str) };
let Ok(indent) = c_indent.to_str() else {
set_last_error("invalid UTF-8 in indent_str");
return std::ptr::null_mut();
};
let opts = SerializeOptions::default().indent(true).indent_str(indent);
let output = crate::serial::serialize_with_options(doc, &opts);
to_c_string(&output)
}
#[no_mangle]
pub unsafe extern "C" fn xmloxide_serialize_html(doc: *const Document) -> *mut c_char {
clear_last_error();
if doc.is_null() {
set_last_error("null document pointer");
return std::ptr::null_mut();
}
let doc = unsafe { &*doc };
let output = crate::serial::html::serialize_html(doc);
to_c_string(&output)
}
#[no_mangle]
pub unsafe extern "C" fn xmloxide_serialize_html5(doc: *const Document) -> *mut c_char {
clear_last_error();
if doc.is_null() {
set_last_error("null document pointer");
return std::ptr::null_mut();
}
let doc = unsafe { &*doc };
let output = crate::serial::html::serialize_html5(doc);
to_c_string(&output)
}