#![allow(unsafe_code, clippy::missing_safety_doc)]
use std::ffi::CStr;
use std::os::raw::c_char;
use crate::html5::{parse_html5, parse_html5_with_options, Html5ParseOptions};
use crate::tree::Document;
use super::{clear_last_error, set_last_error};
#[no_mangle]
pub unsafe extern "C" fn xmloxide_parse_html5(input: *const c_char) -> *mut Document {
clear_last_error();
if input.is_null() {
set_last_error("null input pointer");
return std::ptr::null_mut();
}
let c_str = unsafe { CStr::from_ptr(input) };
let s = match c_str.to_str() {
Ok(s) => s,
Err(e) => {
set_last_error(&format!("invalid UTF-8: {e}"));
return std::ptr::null_mut();
}
};
match parse_html5(s) {
Ok(doc) => Box::into_raw(Box::new(doc)),
Err(e) => {
set_last_error(&e.to_string());
std::ptr::null_mut()
}
}
}
#[no_mangle]
pub unsafe extern "C" fn xmloxide_parse_html5_fragment(
input: *const c_char,
context_element: *const c_char,
) -> *mut Document {
clear_last_error();
if input.is_null() {
set_last_error("null input pointer");
return std::ptr::null_mut();
}
if context_element.is_null() {
set_last_error("null context_element pointer");
return std::ptr::null_mut();
}
let c_input = unsafe { CStr::from_ptr(input) };
let s = match c_input.to_str() {
Ok(s) => s,
Err(e) => {
set_last_error(&format!("invalid UTF-8 in input: {e}"));
return std::ptr::null_mut();
}
};
let c_ctx = unsafe { CStr::from_ptr(context_element) };
let ctx = match c_ctx.to_str() {
Ok(s) => s,
Err(e) => {
set_last_error(&format!("invalid UTF-8 in context_element: {e}"));
return std::ptr::null_mut();
}
};
let opts = Html5ParseOptions {
scripting: false,
fragment_context: Some(ctx.to_string()),
};
match parse_html5_with_options(s, &opts) {
Ok(doc) => Box::into_raw(Box::new(doc)),
Err(e) => {
set_last_error(&e.to_string());
std::ptr::null_mut()
}
}
}