#![allow(unsafe_code, clippy::missing_safety_doc)]
use crate::ffi::{clear_last_error, set_last_error};
use crate::parser::PushParser;
use crate::tree::Document;
#[no_mangle]
pub extern "C" fn xmloxide_push_parser_new() -> *mut PushParser {
clear_last_error();
Box::into_raw(Box::new(PushParser::new()))
}
#[no_mangle]
pub unsafe extern "C" fn xmloxide_push_parser_push(
parser: *mut PushParser,
data: *const u8,
len: usize,
) {
if parser.is_null() || data.is_null() {
return;
}
let parser = &mut *parser;
let slice = std::slice::from_raw_parts(data, len);
parser.push(slice);
}
#[no_mangle]
pub unsafe extern "C" fn xmloxide_push_parser_finish(parser: *mut PushParser) -> *mut Document {
if parser.is_null() {
set_last_error("null parser pointer");
return std::ptr::null_mut();
}
clear_last_error();
let parser = *Box::from_raw(parser);
match parser.finish() {
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_push_parser_buffered_bytes(parser: *const PushParser) -> usize {
if parser.is_null() {
return 0;
}
(*parser).buffered_bytes()
}
#[no_mangle]
pub unsafe extern "C" fn xmloxide_push_parser_reset(parser: *mut PushParser) {
if parser.is_null() {
return;
}
(*parser).reset();
}
#[no_mangle]
pub unsafe extern "C" fn xmloxide_push_parser_free(parser: *mut PushParser) {
if parser.is_null() {
return;
}
drop(Box::from_raw(parser));
}