1#![allow(non_snake_case)]
37#![allow(unused_variables)]
38#![allow(clippy::missing_safety_doc)]
39#![allow(clippy::not_unsafe_ptr_arg_deref)]
40
41use core::ffi::c_void;
42use core::ptr;
43use once_cell::sync::Lazy;
44use parking_lot::Mutex;
45use std::collections::HashMap;
46use std::ffi::{CStr, CString};
47use std::mem::size_of;
48use std::os::raw::{c_char, c_int, c_long, c_uint, c_ulong};
49
50use crate::xml::xinclude;
51use crate::xml::xpath::ast::CompiledExpr;
52use crate::xml::xpath::context::{BoxedXPathFunction, XPathContext};
53use crate::xml::xpath::types::{NodeSet, XPathValue};
54use crate::xml::xpointer;
55
56use crate::abi::allocator::*;
57use crate::abi::callbacks::*;
58use crate::abi::structs::*;
59use crate::abi::types::*;
60
61#[no_mangle]
76pub unsafe extern "C" fn xmlInitParser() {
77 crate::internal::globals::init_parser();
78}
79
80#[no_mangle]
93pub unsafe extern "C" fn xmlInitGlobals() {
94 }
96
97#[no_mangle]
107pub unsafe extern "C" fn xmlInitializeGlobalState(_gs: *mut c_void) {
108 }
110
111#[no_mangle]
120pub extern "C" fn xmlInitializeDict() -> c_int {
121 0
122}
123
124#[no_mangle]
134pub extern "C" fn xmlInitializePredefinedEntities() {
135 }
137
138#[no_mangle]
147pub extern "C" fn xmlCleanupPredefinedEntities() {
148 }
150
151#[no_mangle]
162pub extern "C" fn xmlDefaultSAXHandlerInit() {
163 }
166
167static SAX2_DEFAULT_VERSION: core::sync::atomic::AtomicI32 = core::sync::atomic::AtomicI32::new(2);
176#[no_mangle]
177pub extern "C" fn xmlSAXDefaultVersion(version: c_int) -> c_int {
178 use core::sync::atomic::Ordering;
179 let ret = SAX2_DEFAULT_VERSION.load(Ordering::Relaxed);
180 if version != 1 && version != 2 {
181 return -1;
182 }
183 SAX2_DEFAULT_VERSION.store(version, Ordering::Relaxed);
184 ret
185}
186
187#[no_mangle]
197pub unsafe extern "C" fn xmlSAXVersion(
198 hdlr: *mut crate::abi::structs::_xmlSAXHandler,
199 version: c_int,
200) -> c_int {
201 if hdlr.is_null() {
202 return -1;
203 }
204 if version != 1 && version != 2 {
205 return -1;
206 }
207 unsafe {
209 crate::xml::sax::dispatch::xmlSAX2InitDefaultSAXHandler(hdlr);
210 let h = &mut *hdlr;
211 if version == 2 {
212 h.initialized = crate::abi::constants::XML_SAX2_MAGIC as c_uint;
213 } else {
214 h.initialized = 1;
215 }
216 }
217 0
218}
219
220#[no_mangle]
231pub extern "C" fn xmlHasFeature(feature: c_int) -> c_int {
232 if (1..=24).contains(&feature) {
235 1
236 } else {
237 0
238 }
239}
240
241#[no_mangle]
253pub unsafe extern "C" fn xmlCleanupGlobals() {
254 }
256
257#[no_mangle]
267pub unsafe extern "C" fn xmlCleanupParser() {
268 crate::internal::globals::cleanup_parser();
269}
270
271#[no_mangle]
279pub extern "C" fn xmlNewMutex() -> *mut c_void {
280 crate::xml::threads::new_mutex()
281}
282
283#[no_mangle]
291pub unsafe extern "C" fn xmlFreeMutex(tok: *mut c_void) {
292 crate::xml::threads::free_mutex(tok);
293}
294
295#[no_mangle]
303pub unsafe extern "C" fn xmlMutexLock(tok: *mut c_void) {
304 crate::xml::threads::mutex_lock(tok);
305}
306
307#[no_mangle]
315pub unsafe extern "C" fn xmlMutexUnlock(tok: *mut c_void) {
316 crate::xml::threads::mutex_unlock(tok);
317}
318
319#[no_mangle]
327pub extern "C" fn xmlNewRMutex() -> *mut c_void {
328 crate::xml::threads::new_rmutex()
329}
330
331#[no_mangle]
339pub unsafe extern "C" fn xmlFreeRMutex(tok: *mut c_void) {
340 crate::xml::threads::free_rmutex(tok);
341}
342
343#[no_mangle]
351pub unsafe extern "C" fn xmlRMutexLock(tok: *mut c_void) {
352 crate::xml::threads::rmutex_lock(tok);
353}
354
355#[no_mangle]
363pub unsafe extern "C" fn xmlRMutexUnlock(tok: *mut c_void) {
364 crate::xml::threads::rmutex_unlock(tok);
365}
366
367#[no_mangle]
377pub extern "C" fn xmlCheckThreadLocalStorage() -> c_int {
378 0
379}
380
381#[no_mangle]
391pub unsafe extern "C" fn xmlInitThreads() -> c_int {
392 crate::internal::globals::init_threads()
393}
394
395#[no_mangle]
403pub unsafe extern "C" fn xmlCleanupThreads() {
404 crate::xml::threads::cleanup_threads();
405}
406
407#[no_mangle]
415pub extern "C" fn xmlIsInitialized() -> c_int {
416 if crate::abi::versioning::is_initialized() {
417 1
418 } else {
419 0
420 }
421}
422
423#[no_mangle]
432pub unsafe extern "C" fn xmlLockLibrary() {
433 crate::xml::threads::lock_library();
434}
435
436#[no_mangle]
444pub unsafe extern "C" fn xmlUnlockLibrary() {
445 crate::xml::threads::unlock_library();
446}
447
448#[no_mangle]
465pub unsafe extern "C" fn xmlSetGenericErrorFunc(
466 ctx: *mut c_void,
467 handler: Option<xmlGenericErrorFunc>,
468) {
469 unsafe { crate::xml::errors::set_generic_error_func(ctx, handler) };
471}
472
473#[no_mangle]
485pub unsafe extern "C" fn xmlSetStructuredErrorFunc(
486 ctx: *mut c_void,
487 handler: Option<xmlStructuredErrorFunc>,
488) {
489 unsafe { crate::xml::errors::set_structured_error_func(ctx, handler) };
491}
492
493#[no_mangle]
504pub extern "C" fn xmlGetLastError() -> *mut _xmlError {
505 crate::xml::errors::get_last_error()
506}
507
508#[no_mangle]
522pub unsafe extern "C" fn xmlCopyError(from: *const _xmlError, to: *mut _xmlError) -> c_int {
523 unsafe { crate::xml::errors::copy_error(from, to) }
525}
526
527#[no_mangle]
539pub unsafe extern "C" fn xmlResetError(err: *mut _xmlError) {
540 unsafe { crate::xml::errors::reset_error(err) };
542}
543
544#[no_mangle]
557pub unsafe extern "C" fn xmlRaiseError(
558 ctxt: *mut c_void,
559 ctxt2: *mut c_void,
560 ctxt3: *mut c_void,
561 ctxt4: *mut c_void,
562 ctxt5: *mut c_void,
563 domain: c_int,
564 code: c_int,
565 level: c_int,
566 file: *const c_char,
567 line: c_int,
568 str1: *const c_char,
569 str2: *const c_char,
570 str3: *const c_char,
571 int1: c_int,
572 int2: c_int,
573 msg: *const c_char,
574) {
575 unsafe {
577 crate::xml::errors::raise_error(
578 ctxt, ctxt2, ctxt3, ctxt4, ctxt5, domain, code, level, file, line, str1, str2, str3,
579 int1, int2, msg,
580 );
581 }
582}
583
584#[no_mangle]
592pub extern "C" fn xmlResetLastError() {
593 crate::xml::errors::reset_last_error();
594}
595
596#[no_mangle]
612pub unsafe extern "C" fn xmlStrdup(cur: *const xmlChar) -> *mut xmlChar {
613 if cur.is_null() {
614 return ptr::null_mut();
615 }
616 let len = unsafe { xmlStrlen(cur) };
617 let size = len + 1;
618 let new_ptr = unsafe { xmlMallocImpl(size as usize) };
619 if new_ptr.is_null() {
620 return ptr::null_mut();
621 }
622 unsafe {
623 ptr::copy_nonoverlapping(cur as *const u8, new_ptr as *mut u8, size as usize);
624 }
625 new_ptr as *mut xmlChar
626}
627
628#[no_mangle]
640pub unsafe extern "C" fn xmlStrndup(cur: *const xmlChar, len: c_int) -> *mut xmlChar {
641 if cur.is_null() || len <= 0 {
642 return ptr::null_mut();
643 }
644 let size = len as usize + 1;
645 let new_ptr = unsafe { xmlMallocImpl(size) };
646 if new_ptr.is_null() {
647 return ptr::null_mut();
648 }
649 unsafe {
650 ptr::copy_nonoverlapping(cur as *const u8, new_ptr as *mut u8, len as usize);
651 *(new_ptr.add(len as usize) as *mut u8) = 0;
652 }
653 new_ptr as *mut xmlChar
654}
655
656#[no_mangle]
668pub unsafe extern "C" fn xmlStrlen(str: *const xmlChar) -> c_int {
669 if str.is_null() {
670 return 0;
671 }
672 unsafe { libc::strlen(str as *const c_char) as c_int }
673}
674
675#[no_mangle]
688pub unsafe extern "C" fn xmlStrchr(str: *const xmlChar, val: xmlChar) -> *const xmlChar {
689 if str.is_null() {
690 return ptr::null();
691 }
692 unsafe {
693 let mut cur = str;
694 while *cur != 0 {
695 if *cur == val {
696 return cur;
697 }
698 cur = cur.add(1);
699 }
700 ptr::null()
701 }
702}
703
704#[no_mangle]
715pub unsafe extern "C" fn xmlStrcmp(str1: *const xmlChar, str2: *const xmlChar) -> c_int {
716 if str1.is_null() && str2.is_null() {
717 return 0;
718 }
719 if str1.is_null() {
720 return -1;
721 }
722 if str2.is_null() {
723 return 1;
724 }
725 unsafe { libc::strcmp(str1 as *const c_char, str2 as *const c_char) as c_int }
726}
727
728#[no_mangle]
736pub unsafe extern "C" fn xmlStrncmp(
737 str1: *const xmlChar,
738 str2: *const xmlChar,
739 len: c_int,
740) -> c_int {
741 if len <= 0 {
742 return 0;
743 }
744 if str1.is_null() && str2.is_null() {
745 return 0;
746 }
747 if str1.is_null() {
748 return -1;
749 }
750 if str2.is_null() {
751 return 1;
752 }
753 unsafe { libc::strncmp(str1 as *const c_char, str2 as *const c_char, len as usize) as c_int }
754}
755
756#[no_mangle]
764pub unsafe extern "C" fn xmlStrcasecmp(str1: *const xmlChar, str2: *const xmlChar) -> c_int {
765 if str1.is_null() && str2.is_null() {
766 return 0;
767 }
768 if str1.is_null() {
769 return -1;
770 }
771 if str2.is_null() {
772 return 1;
773 }
774 unsafe { libc::strcasecmp(str1 as *const c_char, str2 as *const c_char) as c_int }
775}
776
777#[no_mangle]
785pub unsafe extern "C" fn xmlStrncasecmp(
786 str1: *const xmlChar,
787 str2: *const xmlChar,
788 len: c_int,
789) -> c_int {
790 if len <= 0 {
791 return 0;
792 }
793 if str1.is_null() && str2.is_null() {
794 return 0;
795 }
796 if str1.is_null() {
797 return -1;
798 }
799 if str2.is_null() {
800 return 1;
801 }
802 unsafe {
803 libc::strncasecmp(str1 as *const c_char, str2 as *const c_char, len as usize) as c_int
804 }
805}
806
807#[no_mangle]
817pub unsafe extern "C" fn xmlStrEqual(str1: *const xmlChar, str2: *const xmlChar) -> c_int {
818 if str1.is_null() && str2.is_null() {
819 return 1;
820 }
821 if str1.is_null() || str2.is_null() {
822 return 0;
823 }
824 unsafe { (libc::strcmp(str1 as *const c_char, str2 as *const c_char) == 0) as c_int }
825}
826
827#[no_mangle]
836pub unsafe extern "C" fn xmlBuildQName(
837 ncname: *const xmlChar,
838 prefix: *const xmlChar,
839 memory: *mut xmlChar,
840 len: c_int,
841) -> *mut xmlChar {
842 crate::xml::string::build_qname(ncname, prefix, memory, len)
843}
844
845#[no_mangle]
853pub unsafe extern "C" fn xmlSplitQName2(
854 name: *const xmlChar,
855 prefix: *mut *mut xmlChar,
856) -> *mut xmlChar {
857 crate::xml::string::split_qname2(name, prefix)
858}
859
860#[no_mangle]
868pub unsafe extern "C" fn xmlSplitQName3(name: *const xmlChar, len: *mut c_int) -> c_int {
869 crate::xml::string::split_qname3(name, len)
870}
871
872#[no_mangle]
874pub unsafe extern "C" fn xmlSplitQName(
875 name: *const xmlChar,
876 prefix: *mut *mut xmlChar,
877) -> *mut xmlChar {
878 crate::xml::string::split_qname2(name, prefix)
879}
880
881#[no_mangle]
889pub unsafe extern "C" fn xmlUTF8Strlen(utf: *const xmlChar) -> c_int {
890 crate::xml::string::utf8_strlen(utf)
891}
892
893#[no_mangle]
901pub unsafe extern "C" fn xmlUTF8Size(utf: *const xmlChar) -> c_int {
902 crate::xml::string::utf8_size(utf)
903}
904
905#[no_mangle]
913pub unsafe extern "C" fn xmlCheckUTF8(utf: *const xmlChar) -> c_int {
914 crate::xml::string::check_utf8(utf)
915}
916
917#[no_mangle]
928pub unsafe extern "C" fn xmlStrQEqual(
929 pref: *const xmlChar,
930 name: *const xmlChar,
931 str: *const xmlChar,
932) -> c_int {
933 if name.is_null() || str.is_null() {
934 return 0;
935 }
936 if pref.is_null() {
937 return unsafe { xmlStrEqual(name, str) };
938 }
939 let pref_len = unsafe { xmlStrlen(pref) };
941 let name_len = unsafe { xmlStrlen(name) };
942 let total_len = pref_len + 1 + name_len;
943 let str_len = unsafe { xmlStrlen(str) };
944 if total_len != str_len {
945 return 0;
946 }
947 if unsafe {
949 libc::strncmp(
950 pref as *const c_char,
951 str as *const c_char,
952 pref_len as usize,
953 )
954 } != 0
955 {
956 return 0;
957 }
958 if unsafe { *str.add(pref_len as usize) } != b':' as xmlChar {
960 return 0;
961 }
962 (unsafe {
964 libc::strncmp(
965 name as *const c_char,
966 str.add((pref_len + 1) as usize) as *const c_char,
967 name_len as usize,
968 ) == 0
969 }) as c_int
970}
971
972#[no_mangle]
986pub unsafe extern "C" fn xmlStrcat(cur: *mut xmlChar, add: *const xmlChar) -> *mut xmlChar {
987 if add.is_null() {
988 return cur;
989 }
990 if cur.is_null() {
991 return unsafe { xmlStrdup(add) };
992 }
993 let cur_len = unsafe { xmlStrlen(cur) } as usize;
994 let add_len = unsafe { xmlStrlen(add) } as usize;
995 let new_size = cur_len + add_len + 1;
996 let new_ptr = unsafe { xmlReallocImpl(cur as *mut c_void, new_size) };
997 if new_ptr.is_null() {
998 return ptr::null_mut();
999 }
1000 unsafe {
1001 ptr::copy_nonoverlapping(add as *const u8, (new_ptr as *mut u8).add(cur_len), add_len);
1002 *((new_ptr as *mut u8).add(cur_len + add_len)) = 0;
1003 }
1004 new_ptr as *mut xmlChar
1005}
1006
1007#[no_mangle]
1019pub unsafe extern "C" fn xmlStrncat(
1020 cur: *mut xmlChar,
1021 add: *const xmlChar,
1022 len: c_int,
1023) -> *mut xmlChar {
1024 if add.is_null() || len <= 0 {
1025 return cur;
1026 }
1027 let len = len as usize;
1028 if cur.is_null() {
1029 return unsafe { xmlStrndup(add, len as c_int) };
1030 }
1031 let cur_len = unsafe { xmlStrlen(cur) } as usize;
1032 let new_size = cur_len + len + 1;
1033 let new_ptr = unsafe { xmlReallocImpl(cur as *mut c_void, new_size) };
1034 if new_ptr.is_null() {
1035 return ptr::null_mut();
1036 }
1037 unsafe {
1038 ptr::copy_nonoverlapping(add as *const u8, (new_ptr as *mut u8).add(cur_len), len);
1039 *((new_ptr as *mut u8).add(cur_len + len)) = 0;
1040 }
1041 new_ptr as *mut xmlChar
1042}
1043
1044#[no_mangle]
1052pub unsafe extern "C" fn xmlStrncatNew(
1053 str1: *const xmlChar,
1054 str2: *const xmlChar,
1055 len: c_int,
1056) -> *mut xmlChar {
1057 let mut result: *mut xmlChar = ptr::null_mut();
1058 if !str1.is_null() {
1059 result = unsafe { xmlStrdup(str1) };
1060 }
1061 if !str2.is_null() && len > 0 {
1062 result = unsafe { xmlStrncat(result, str2, len) };
1063 }
1064 result
1065}
1066
1067#[no_mangle]
1080pub unsafe extern "C" fn xmlStrcpy(dst: *mut xmlChar, src: *const xmlChar) -> *mut xmlChar {
1081 if dst.is_null() || src.is_null() {
1082 return dst;
1083 }
1084 let len = unsafe { xmlStrlen(src) } as usize + 1;
1085 unsafe {
1086 ptr::copy_nonoverlapping(src as *const u8, dst as *mut u8, len);
1087 }
1088 dst
1089}
1090
1091#[no_mangle]
1099pub unsafe extern "C" fn xmlStrncpy(
1100 dst: *mut xmlChar,
1101 src: *const xmlChar,
1102 len: c_int,
1103) -> *mut xmlChar {
1104 if dst.is_null() || src.is_null() || len <= 0 {
1105 return dst;
1106 }
1107 let len = len as usize;
1108 let src_len = unsafe { xmlStrlen(src) } as usize;
1109 let copy_len = if src_len < len { src_len } else { len - 1 };
1110 unsafe {
1111 ptr::copy_nonoverlapping(src as *const u8, dst as *mut u8, copy_len);
1112 *dst.add(copy_len) = 0;
1113 }
1114 dst
1115}
1116
1117#[no_mangle]
1127pub unsafe extern "C" fn xmlStrsub(str: *const xmlChar, start: c_int, len: c_int) -> *mut xmlChar {
1128 if str.is_null() || start < 0 || len < 0 {
1129 return ptr::null_mut();
1130 }
1131 let str_len = unsafe { xmlStrlen(str) };
1132 if start >= str_len {
1133 return unsafe { xmlStrdup(b"\0" as *const u8 as *const xmlChar) };
1134 }
1135 let actual_len = if start + len > str_len {
1136 str_len - start
1137 } else {
1138 len
1139 };
1140 unsafe { xmlStrndup(str.add(start as usize), actual_len) }
1141}
1142
1143#[no_mangle]
1160pub unsafe extern "C" fn xmlNewDoc(version: *const xmlChar) -> *mut _xmlDoc {
1161 crate::xml::tree::new_doc(version)
1162}
1163
1164#[no_mangle]
1176pub unsafe extern "C" fn xmlFreeDoc(doc: *mut _xmlDoc) {
1177 crate::xml::tree::free_doc(doc);
1178}
1179
1180#[no_mangle]
1190pub unsafe extern "C" fn xmlGetDocCompressMode(doc: *mut _xmlDoc) -> c_int {
1191 crate::xml::tree::xmlGetDocCompressMode(doc)
1192}
1193
1194#[no_mangle]
1202pub unsafe extern "C" fn xmlSetDocCompressMode(doc: *mut _xmlDoc, mode: c_int) {
1203 crate::xml::tree::xmlSetDocCompressMode(doc, mode);
1204}
1205
1206#[no_mangle]
1220pub unsafe extern "C" fn xmlNewNode(ns: *mut _xmlNs, name: *const xmlChar) -> *mut _xmlNode {
1221 crate::xml::tree::new_node(ns, name)
1222}
1223
1224#[no_mangle]
1237pub unsafe extern "C" fn xmlFreeNode(node: *mut _xmlNode) {
1238 crate::xml::tree::free_node(node);
1239}
1240
1241#[no_mangle]
1258pub unsafe extern "C" fn xmlFreeNodeList(node: *mut _xmlNode) {
1259 crate::xml::tree::free_node_list(node);
1260}
1261
1262#[no_mangle]
1274pub unsafe extern "C" fn xmlUnlinkNode(node: *mut _xmlNode) {
1275 crate::xml::tree::unlink_node(node);
1276}
1277
1278#[no_mangle]
1294pub unsafe extern "C" fn xmlSAX2InitDefaultSAXHandler(
1295 handler: *mut crate::abi::structs::_xmlSAXHandler,
1296 _warning: c_int,
1297) {
1298 crate::xml::sax::dispatch::xmlSAX2InitDefaultSAXHandler(handler);
1299}
1300
1301#[no_mangle]
1320pub unsafe extern "C" fn xmlSAX2InitHtmlDefaultSAXHandler(
1321 handler: *mut crate::abi::structs::_xmlSAXHandler,
1322) {
1323 use crate::abi::callbacks::*;
1324 use crate::abi::structs::_xmlSAXHandler;
1325 if handler.is_null() {
1326 return;
1327 }
1328 unsafe {
1330 if (*handler).initialized != 0 {
1332 return;
1333 }
1334 crate::xml::sax::dispatch::xmlSAX2InitDefaultSAXHandler(handler);
1335 let h = &mut *handler;
1336 h.resolveEntity = None;
1337 h.getParameterEntity = None;
1338 h.entityDecl = None;
1339 h.attributeDecl = None;
1340 h.elementDecl = None;
1341 h.notationDecl = None;
1342 h.unparsedEntityDecl = None;
1343 h.reference = None;
1344 h.externalSubset = None;
1345 h.initialized = 1;
1346 }
1347}
1348
1349#[no_mangle]
1363pub unsafe extern "C" fn xmlAddChild(parent: *mut _xmlNode, cur: *mut _xmlNode) -> *mut _xmlNode {
1364 crate::xml::tree::add_child(parent, cur)
1365}
1366
1367#[no_mangle]
1379pub unsafe extern "C" fn xmlAddSibling(
1380 cur: *mut _xmlNode,
1381 sibling: *mut _xmlNode,
1382) -> *mut _xmlNode {
1383 crate::xml::tree::add_sibling(cur, sibling)
1384}
1385
1386#[no_mangle]
1405pub unsafe extern "C" fn xmlNewChild(
1406 parent: *mut _xmlNode,
1407 ns: *mut _xmlNs,
1408 name: *const xmlChar,
1409 content: *const xmlChar,
1410) -> *mut _xmlNode {
1411 crate::xml::tree::new_child(parent, ns, name)
1412}
1413
1414#[no_mangle]
1429pub unsafe extern "C" fn xmlDocSetRootElement(
1430 doc: *mut _xmlDoc,
1431 root: *mut _xmlNode,
1432) -> *mut _xmlNode {
1433 crate::xml::tree::doc_set_root_element(doc, root)
1434}
1435
1436#[no_mangle]
1446pub extern "C" fn xmlDocGetRootElement(doc: *const _xmlDoc) -> *mut _xmlNode {
1447 crate::xml::tree::doc_get_root_element(doc as *mut _xmlDoc)
1448}
1449
1450#[no_mangle]
1463pub unsafe extern "C" fn xmlCopyNode(node: *const _xmlNode, extended: c_int) -> *mut _xmlNode {
1464 crate::xml::tree::copy_node(node, extended)
1465}
1466
1467#[no_mangle]
1477pub unsafe extern "C" fn xmlCopyDoc(doc: *const _xmlDoc, recursive: c_int) -> *mut _xmlDoc {
1478 crate::xml::tree::copy_doc(doc, recursive)
1479}
1480
1481#[no_mangle]
1492pub unsafe extern "C" fn xmlNewText(content: *const xmlChar) -> *mut _xmlNode {
1493 crate::xml::tree::new_text(content)
1494}
1495
1496#[no_mangle]
1504pub unsafe extern "C" fn xmlNewComment(content: *const xmlChar) -> *mut _xmlNode {
1505 crate::xml::tree::new_comment(content)
1506}
1507
1508#[no_mangle]
1516pub unsafe extern "C" fn xmlNewPI(name: *const xmlChar, content: *const xmlChar) -> *mut _xmlNode {
1517 crate::xml::tree::new_pi(name, content)
1518}
1519
1520#[no_mangle]
1528pub unsafe extern "C" fn xmlNewCDataBlock(
1529 doc: *mut _xmlDoc,
1530 content: *const xmlChar,
1531 len: c_int,
1532) -> *mut _xmlNode {
1533 crate::xml::tree::new_cdata_block(doc, content, len)
1534}
1535
1536#[no_mangle]
1550pub unsafe extern "C" fn xmlNewNs(
1551 node: *mut _xmlNode,
1552 href: *const xmlChar,
1553 prefix: *const xmlChar,
1554) -> *mut _xmlNs {
1555 crate::xml::tree::new_ns(node, href, prefix)
1556}
1557
1558#[no_mangle]
1566pub unsafe extern "C" fn xmlSetNs(node: *mut _xmlNode, ns: *mut _xmlNs) {
1567 crate::xml::tree::set_ns(node, ns);
1568}
1569
1570#[no_mangle]
1578pub unsafe extern "C" fn xmlGetNsList(
1579 doc: *mut _xmlDoc,
1580 node: *const _xmlNode,
1581) -> *mut *mut _xmlNs {
1582 crate::xml::tree::get_ns_list(doc, node as *mut _xmlNode)
1583}
1584
1585#[no_mangle]
1593pub unsafe extern "C" fn xmlSearchNs(
1594 doc: *mut _xmlDoc,
1595 node: *mut _xmlNode,
1596 nameSpace: *const xmlChar,
1597) -> *mut _xmlNs {
1598 crate::xml::tree::search_ns(doc, node, nameSpace)
1599}
1600
1601#[no_mangle]
1609pub unsafe extern "C" fn xmlSearchNsByHref(
1610 doc: *mut _xmlDoc,
1611 node: *mut _xmlNode,
1612 href: *const xmlChar,
1613) -> *mut _xmlNs {
1614 crate::xml::tree::search_ns_by_href(doc, node, href)
1615}
1616
1617#[no_mangle]
1634pub unsafe extern "C" fn xmlSetProp(
1635 node: *mut _xmlNode,
1636 name: *const xmlChar,
1637 value: *const xmlChar,
1638) -> *mut _xmlAttr {
1639 crate::xml::tree::set_prop(node, name, value)
1640}
1641
1642#[no_mangle]
1652pub unsafe extern "C" fn xmlGetProp(node: *const _xmlNode, name: *const xmlChar) -> *mut xmlChar {
1653 crate::xml::tree::get_prop(node as *mut _xmlNode, name)
1654}
1655
1656#[no_mangle]
1664pub unsafe extern "C" fn xmlGetNsProp(
1665 node: *const _xmlNode,
1666 name: *const xmlChar,
1667 nameSpace: *const xmlChar,
1668) -> *mut xmlChar {
1669 crate::xml::tree::get_ns_prop(node as *mut _xmlNode, name, nameSpace)
1670}
1671
1672#[no_mangle]
1681pub unsafe extern "C" fn xmlSetNsProp(
1682 node: *mut _xmlNode,
1683 ns: *mut _xmlNs,
1684 name: *const xmlChar,
1685 value: *const xmlChar,
1686) -> *mut _xmlAttr {
1687 crate::xml::tree::set_ns_prop(node, ns, name, value)
1688}
1689
1690#[no_mangle]
1700pub unsafe extern "C" fn xmlRemoveProp(attr: *mut _xmlAttr) -> c_int {
1701 crate::xml::tree::remove_prop(attr)
1702}
1703
1704#[no_mangle]
1714pub unsafe extern "C" fn xmlHasProp(node: *const _xmlNode, name: *const xmlChar) -> *mut _xmlAttr {
1715 crate::xml::tree::has_prop(node as *mut _xmlNode, name)
1716}
1717
1718#[no_mangle]
1727pub unsafe extern "C" fn xmlHasNsProp(
1728 node: *const _xmlNode,
1729 name: *const xmlChar,
1730 nameSpace: *const xmlChar,
1731) -> *mut _xmlAttr {
1732 crate::xml::tree::has_ns_prop(node as *mut _xmlNode, name, nameSpace)
1733}
1734
1735#[no_mangle]
1745pub unsafe extern "C" fn xmlUnsetProp(node: *mut _xmlNode, name: *const xmlChar) -> c_int {
1746 crate::xml::tree::unset_prop(node, name)
1747}
1748
1749#[no_mangle]
1758pub unsafe extern "C" fn xmlUnsetNsProp(
1759 node: *mut _xmlNode,
1760 name: *const xmlChar,
1761 nameSpace: *const xmlChar,
1762) -> c_int {
1763 crate::xml::tree::unset_ns_prop(node, name, nameSpace)
1764}
1765
1766#[no_mangle]
1774pub unsafe extern "C" fn xmlFirstElementChild(parent: *mut _xmlNode) -> *mut _xmlNode {
1775 crate::xml::tree::first_element_child(parent)
1776}
1777
1778#[no_mangle]
1780pub unsafe extern "C" fn xmlLastElementChild(parent: *mut _xmlNode) -> *mut _xmlNode {
1781 crate::xml::tree::last_element_child(parent)
1782}
1783
1784#[no_mangle]
1786pub unsafe extern "C" fn xmlNextElementSibling(node: *mut _xmlNode) -> *mut _xmlNode {
1787 crate::xml::tree::next_element_sibling(node)
1788}
1789
1790#[no_mangle]
1792pub unsafe extern "C" fn xmlPreviousElementSibling(node: *mut _xmlNode) -> *mut _xmlNode {
1793 crate::xml::tree::previous_element_sibling(node)
1794}
1795
1796#[no_mangle]
1804pub unsafe extern "C" fn xmlChildElementCount(parent: *mut _xmlNode) -> c_ulong {
1805 crate::xml::tree::child_element_count(parent)
1806}
1807
1808#[no_mangle]
1816pub unsafe extern "C" fn xmlTextConcat(
1817 node: *mut _xmlNode,
1818 content: *const xmlChar,
1819 len: c_int,
1820) -> c_int {
1821 crate::xml::tree::text_concat(node, content, len)
1822}
1823
1824#[no_mangle]
1832pub unsafe extern "C" fn xmlTextMerge(
1833 first: *mut _xmlNode,
1834 second: *mut _xmlNode,
1835) -> *mut _xmlNode {
1836 crate::xml::tree::text_merge(first, second)
1837}
1838
1839#[no_mangle]
1847pub extern "C" fn xmlGetIntSubset(doc: *const _xmlDoc) -> *mut _xmlDtd {
1848 crate::xml::tree::get_int_subset(doc)
1849}
1850
1851#[no_mangle]
1860pub unsafe extern "C" fn xmlNewDtd(
1861 doc: *mut _xmlDoc,
1862 name: *const xmlChar,
1863 ExternalID: *const xmlChar,
1864 SystemID: *const xmlChar,
1865) -> *mut _xmlDtd {
1866 crate::xml::tree::new_dtd(doc, name, ExternalID, SystemID)
1867}
1868
1869#[no_mangle]
1879pub unsafe extern "C" fn xmlNewEntity(
1880 doc: *mut _xmlDoc,
1881 name: *const xmlChar,
1882 type_: c_int,
1883 ExternalID: *const xmlChar,
1884 SystemID: *const xmlChar,
1885 content: *const xmlChar,
1886) -> *mut _xmlEntity {
1887 crate::xml::tree::new_entity(doc, name, type_, ExternalID, SystemID, content)
1888}
1889
1890#[no_mangle]
1898pub unsafe extern "C" fn xmlGetDocEntity(
1899 doc: *const _xmlDoc,
1900 name: *const xmlChar,
1901) -> *mut _xmlEntity {
1902 crate::xml::tree::get_doc_entity(doc, name)
1903}
1904
1905#[no_mangle]
1913pub unsafe extern "C" fn xmlGetParameterEntity(
1914 doc: *const _xmlDoc,
1915 name: *const xmlChar,
1916) -> *mut _xmlEntity {
1917 crate::xml::tree::get_parameter_entity(doc, name)
1918}
1919
1920#[no_mangle]
1931pub unsafe extern "C" fn xmlCreateIntSubset(
1932 doc: *mut _xmlDoc,
1933 name: *const xmlChar,
1934 ExternalID: *const xmlChar,
1935 SystemID: *const xmlChar,
1936) -> *mut _xmlDtd {
1937 crate::xml::dtd::create_int_subset(doc, name, ExternalID, SystemID)
1938}
1939
1940#[no_mangle]
1948pub unsafe extern "C" fn xmlFreeDtd(dtd: *mut _xmlDtd) {
1949 crate::xml::dtd::free_dtd(dtd);
1950}
1951
1952#[no_mangle]
1962pub unsafe extern "C" fn xmlAddNotationDecl(
1963 dtd: *mut _xmlDtd,
1964 name: *const xmlChar,
1965 PublicID: *const xmlChar,
1966 SystemID: *const xmlChar,
1967) -> *mut _xmlNotation {
1968 crate::xml::dtd::add_notation_decl(dtd, name, PublicID, SystemID)
1969}
1970
1971#[no_mangle]
1979pub unsafe extern "C" fn xmlGetNotationDecl(
1980 dtd: *mut _xmlDtd,
1981 name: *const xmlChar,
1982) -> *mut _xmlNotation {
1983 crate::xml::dtd::get_notation_decl(dtd, name)
1984}
1985
1986#[no_mangle]
1994pub unsafe extern "C" fn xmlCopyNotation(notation: *mut _xmlNotation) -> *mut _xmlNotation {
1995 crate::xml::dtd::copy_notation(notation)
1996}
1997
1998#[no_mangle]
2006pub unsafe extern "C" fn xmlFreeNotation(notation: *mut _xmlNotation) {
2007 crate::xml::dtd::free_notation(notation);
2008}
2009
2010#[no_mangle]
2019pub unsafe extern "C" fn xmlAddElementDecl(
2020 dtd: *mut _xmlDtd,
2021 name: *const xmlChar,
2022 type_: c_int,
2023 content: *mut _xmlElementContent,
2024) -> *mut _xmlElement {
2025 crate::xml::dtd::add_element_decl(dtd, name, type_, content)
2026}
2027
2028#[no_mangle]
2036pub unsafe extern "C" fn xmlGetElementDecl(
2037 dtd: *mut _xmlDtd,
2038 name: *const xmlChar,
2039) -> *mut _xmlElement {
2040 crate::xml::dtd::get_element_decl(dtd, name)
2041}
2042
2043#[no_mangle]
2051pub unsafe extern "C" fn xmlCopyElement(elem: *mut _xmlElement) -> *mut _xmlElement {
2052 crate::xml::dtd::copy_element(elem)
2053}
2054
2055#[no_mangle]
2063pub unsafe extern "C" fn xmlFreeElement(elem: *mut _xmlElement) {
2064 crate::xml::dtd::free_element(elem);
2065}
2066
2067#[no_mangle]
2078pub unsafe extern "C" fn xmlAddAttributeDecl(
2079 dtd: *mut _xmlDtd,
2080 elem: *mut _xmlElement,
2081 name: *const xmlChar,
2082 type_: c_int,
2083 def: c_int,
2084 defaultValue: *const xmlChar,
2085 tree: *mut _xmlEnumeration,
2086) -> *mut _xmlAttribute {
2087 crate::xml::dtd::add_attribute_decl(dtd, elem, name, type_, def, defaultValue, tree)
2088}
2089
2090#[no_mangle]
2099pub unsafe extern "C" fn xmlGetAttributeDecl(
2100 dtd: *mut _xmlDtd,
2101 elem: *mut _xmlElement,
2102 name: *const xmlChar,
2103 namePrefix: c_int,
2104) -> *mut _xmlAttribute {
2105 crate::xml::dtd::get_attribute_decl(dtd, elem, name, namePrefix)
2106}
2107
2108#[no_mangle]
2116pub unsafe extern "C" fn xmlCopyAttribute(attr: *mut _xmlAttribute) -> *mut _xmlAttribute {
2117 crate::xml::dtd::copy_attribute_decl(attr)
2118}
2119
2120#[no_mangle]
2128pub unsafe extern "C" fn xmlFreeAttribute(attr: *mut _xmlAttribute) {
2129 crate::xml::dtd::free_attribute(attr);
2130}
2131
2132#[no_mangle]
2140pub unsafe extern "C" fn xmlNewElementContent(
2141 name: *const xmlChar,
2142 type_: c_int,
2143) -> *mut _xmlElementContent {
2144 crate::xml::dtd::create_content_model(name, type_)
2145}
2146
2147#[no_mangle]
2155pub unsafe extern "C" fn xmlCopyElementContent(
2156 content: *mut _xmlElementContent,
2157) -> *mut _xmlElementContent {
2158 crate::xml::dtd::copy_content_model(content)
2159}
2160
2161#[no_mangle]
2169pub unsafe extern "C" fn xmlFreeElementContent(cur: *mut _xmlElementContent) {
2170 crate::xml::dtd::free_content_model(cur);
2171}
2172
2173#[no_mangle]
2185pub unsafe extern "C" fn xmlAddEntity(
2186 dtd: *mut _xmlDtd,
2187 name: *const xmlChar,
2188 type_: c_int,
2189 ExternalID: *const xmlChar,
2190 SystemID: *const xmlChar,
2191 content: *const xmlChar,
2192) -> *mut _xmlEntity {
2193 crate::xml::entities::add_entity(dtd, name, type_, ExternalID, SystemID, content)
2194}
2195
2196#[no_mangle]
2208pub unsafe extern "C" fn xmlAddDocEntity(
2209 doc: *mut _xmlDoc,
2210 name: *const xmlChar,
2211 type_: c_int,
2212 ExternalID: *const xmlChar,
2213 SystemID: *const xmlChar,
2214 content: *const xmlChar,
2215) -> *mut _xmlEntity {
2216 crate::xml::tree::add_doc_entity(doc, name, type_, ExternalID, SystemID, content)
2217}
2218
2219#[no_mangle]
2230pub unsafe extern "C" fn xmlAddDtdEntity(
2231 doc: *mut _xmlDoc,
2232 name: *const xmlChar,
2233 type_: c_int,
2234 ExternalID: *const xmlChar,
2235 SystemID: *const xmlChar,
2236 content: *const xmlChar,
2237) -> *mut _xmlEntity {
2238 crate::xml::tree::add_dtd_entity(doc, name, type_, ExternalID, SystemID, content)
2239}
2240
2241#[no_mangle]
2250pub unsafe extern "C" fn xmlGetDtdEntity(
2251 doc: *mut _xmlDoc,
2252 name: *const xmlChar,
2253) -> *mut _xmlEntity {
2254 crate::xml::tree::get_dtd_entity(doc, name)
2255}
2256
2257#[no_mangle]
2265pub unsafe extern "C" fn xmlGetEntity(doc: *mut _xmlDoc, name: *const xmlChar) -> *mut _xmlEntity {
2266 crate::xml::entities::get_entity(doc, name)
2267}
2268
2269#[no_mangle]
2277pub unsafe extern "C" fn xmlCopyEntity(entity: *mut _xmlEntity) -> *mut _xmlEntity {
2278 crate::xml::entities::copy_entity(entity)
2279}
2280
2281#[no_mangle]
2289pub unsafe extern "C" fn xmlFreeEntity(entity: *mut _xmlEntity) {
2290 crate::xml::entities::free_entity(entity);
2291}
2292
2293#[no_mangle]
2301pub unsafe extern "C" fn xmlEncodeEntitiesReentrant(
2302 doc: *mut _xmlDoc,
2303 input: *const xmlChar,
2304) -> *mut xmlChar {
2305 crate::xml::entities::encode_entities_reentrant(doc, input)
2306}
2307
2308#[no_mangle]
2319pub unsafe extern "C" fn xmlEncodeSpecialChars(
2320 _doc: *const _xmlDoc,
2321 input: *const xmlChar,
2322) -> *mut xmlChar {
2323 if input.is_null() {
2324 return ptr::null_mut();
2325 }
2326 unsafe {
2327 let len = crate::xml::string::xml_strlen(input);
2328 let cap = len * 6 + 1;
2331 let out = crate::abi::allocator::xmlMallocImpl(cap) as *mut xmlChar;
2332 if out.is_null() {
2333 return ptr::null_mut();
2334 }
2335 let mut o = 0usize;
2336 let mut i = 0usize;
2337 while i < len {
2338 let c = *input.add(i);
2339 let rep: &[u8] = match c {
2340 b'<' => b"<",
2341 b'>' => b">",
2342 b'&' => b"&",
2343 b'"' => b""",
2344 b'\r' => b" ",
2345 _ => {
2346 *out.add(o) = c;
2347 o += 1;
2348 i += 1;
2349 continue;
2350 }
2351 };
2352 core::ptr::copy_nonoverlapping(rep.as_ptr(), out.add(o), rep.len());
2353 o += rep.len();
2354 i += 1;
2355 }
2356 *out.add(o) = 0;
2357 out
2358 }
2359}
2360
2361#[no_mangle]
2372pub unsafe extern "C" fn xmlEncodeEntities(
2373 _doc: *mut _xmlDoc,
2374 _input: *const xmlChar,
2375) -> *mut xmlChar {
2376 use core::sync::atomic::{AtomicBool, Ordering};
2377 static WARNED: AtomicBool = AtomicBool::new(false);
2378 if !WARNED.swap(true, Ordering::Relaxed) {
2379 let msg = b"xmlEncodeEntities is deprecated, use xmlEncodeSpecialChars or xmlEncodeEntitiesReentrant\n";
2381 unsafe {
2382 libc::fwrite(
2383 msg.as_ptr() as *const c_void,
2384 1,
2385 msg.len(),
2386 libc::fdopen(2, b"w\0" as *const u8 as *const c_char) as *mut libc::FILE,
2387 );
2388 }
2389 }
2390 ptr::null_mut()
2391}
2392
2393#[no_mangle]
2401pub extern "C" fn xmlGetLineNo(node: *const _xmlNode) -> c_long {
2402 crate::xml::tree::get_line_no(node)
2403}
2404
2405#[no_mangle]
2417pub unsafe extern "C" fn xmlNodeDump(
2418 buf: *mut _xmlBuffer,
2419 doc: *mut _xmlDoc,
2420 cur: *mut _xmlNode,
2421 level: c_int,
2422 format: c_int,
2423) -> c_int {
2424 if buf.is_null() || cur.is_null() {
2425 return -1;
2426 }
2427 crate::xml::tree::xmlNodeDump(buf, doc, cur, level, format)
2428}
2429
2430#[no_mangle]
2438pub unsafe extern "C" fn xmlDocDump(fp: *mut c_void, doc: *mut _xmlDoc) -> c_int {
2439 if fp.is_null() || doc.is_null() {
2440 return -1;
2441 }
2442 crate::xml::tree::xmlDocDump(fp, doc)
2443}
2444
2445#[no_mangle]
2453pub unsafe extern "C" fn xmlDocDumpFormatMemory(
2454 doc: *mut _xmlDoc,
2455 mem: *mut *mut xmlChar,
2456 size: *mut c_int,
2457 format: c_int,
2458) {
2459 if doc.is_null() || mem.is_null() || size.is_null() {
2460 return;
2461 }
2462 crate::xml::tree::xmlDocDumpFormatMemory(doc, mem, size, format)
2463}
2464
2465#[no_mangle]
2473pub unsafe extern "C" fn xmlDocDumpMemory(
2474 doc: *mut _xmlDoc,
2475 mem: *mut *mut xmlChar,
2476 size: *mut c_int,
2477) {
2478 if doc.is_null() || mem.is_null() || size.is_null() {
2479 return;
2480 }
2481 crate::xml::tree::xmlDocDumpMemory(doc, mem, size)
2482}
2483
2484#[no_mangle]
2492pub unsafe extern "C" fn xmlSaveFile(filename: *const c_char, cur: *mut _xmlDoc) -> c_int {
2493 if filename.is_null() || cur.is_null() {
2494 return -1;
2495 }
2496 crate::xml::tree::xmlSaveFile(filename, cur)
2497}
2498
2499#[no_mangle]
2507pub unsafe extern "C" fn xmlSaveFileEnc(
2508 filename: *const c_char,
2509 cur: *mut _xmlDoc,
2510 encoding: *const c_char,
2511) -> c_int {
2512 if filename.is_null() || cur.is_null() {
2513 return -1;
2514 }
2515 crate::xml::tree::xmlSaveFileEnc(filename, cur, encoding)
2516}
2517
2518#[no_mangle]
2526pub unsafe extern "C" fn xmlSaveFormatFile(
2527 filename: *const c_char,
2528 cur: *mut _xmlDoc,
2529 format: c_int,
2530) -> c_int {
2531 if filename.is_null() || cur.is_null() {
2532 return -1;
2533 }
2534 crate::xml::tree::xmlSaveFormatFile(filename, cur, format)
2535}
2536
2537#[no_mangle]
2545pub unsafe extern "C" fn xmlSaveFormatFileEnc(
2546 filename: *const c_char,
2547 cur: *mut _xmlDoc,
2548 encoding: *const c_char,
2549 format: c_int,
2550) -> c_int {
2551 if filename.is_null() || cur.is_null() {
2552 return -1;
2553 }
2554 crate::xml::tree::xmlSaveFormatFileEnc(filename, cur, encoding, format)
2555}
2556
2557#[no_mangle]
2572pub unsafe extern "C" fn xmlReadDoc(
2573 cur: *const xmlChar,
2574 URL: *const c_char,
2575 encoding: *const c_char,
2576 options: c_int,
2577) -> *mut _xmlDoc {
2578 if cur.is_null() {
2580 return ptr::null_mut();
2581 }
2582 let ctxt = crate::xml::parser::helpers::create_parser_ctxt();
2583 if ctxt.is_null() {
2584 return ptr::null_mut();
2585 }
2586 let len = crate::xml::string::xml_strlen(cur);
2587 let input = crate::xml::parser::helpers::input_from_memory(cur as *const c_char, len as c_int);
2588 crate::xml::parser::helpers::setup_parser_input(ctxt, input);
2589 (*ctxt).options = options;
2590 if crate::xml::parser::helpers::parse_document(ctxt) != 0 {
2591 let doc = (*ctxt).myDoc;
2592 crate::xml::parser::helpers::free_parser_ctxt(ctxt);
2593 return doc;
2594 }
2595 let doc = (*ctxt).myDoc;
2596 if !doc.is_null() {
2597 (*doc).URL = crate::xml::string::xml_strdup(URL as *const xmlChar);
2598 }
2599 crate::xml::parser::helpers::free_parser_ctxt(ctxt);
2600 doc
2601}
2602
2603#[no_mangle]
2611pub unsafe extern "C" fn xmlReadFile(
2612 URL: *const c_char,
2613 encoding: *const c_char,
2614 options: c_int,
2615) -> *mut _xmlDoc {
2616 if URL.is_null() {
2618 return ptr::null_mut();
2619 }
2620 let ctxt = crate::xml::parser::helpers::create_parser_ctxt();
2621 if ctxt.is_null() {
2622 return ptr::null_mut();
2623 }
2624 let input = match crate::xml::parser::helpers::input_from_file(URL) {
2625 Ok(input) => input,
2626 Err(_) => {
2627 crate::xml::parser::helpers::free_parser_ctxt(ctxt);
2628 return ptr::null_mut();
2629 }
2630 };
2631 crate::xml::parser::helpers::setup_parser_input(ctxt, input);
2632 (*ctxt).options = options;
2633 if crate::xml::parser::helpers::parse_document(ctxt) != 0 {
2634 let doc = (*ctxt).myDoc;
2635 crate::xml::parser::helpers::free_parser_ctxt(ctxt);
2636 if options & 1 << 0 != 0 {
2640 return doc;
2641 }
2642 if !doc.is_null() {
2643 crate::xml::tree::free_doc(doc);
2644 }
2645 return ptr::null_mut();
2646 }
2647 let doc = (*ctxt).myDoc;
2648 crate::xml::parser::helpers::free_parser_ctxt(ctxt);
2649 doc
2650}
2651
2652#[no_mangle]
2661pub unsafe extern "C" fn xmlRecoverDoc(cur: *const xmlChar) -> *mut _xmlDoc {
2662 unsafe { xmlReadDoc(cur, ptr::null(), ptr::null(), 1 << 0) }
2663}
2664
2665#[no_mangle]
2673pub unsafe extern "C" fn xmlRecoverFile(filename: *const c_char) -> *mut _xmlDoc {
2674 unsafe { xmlReadFile(filename, ptr::null(), 1 << 0) }
2675}
2676
2677#[no_mangle]
2685pub unsafe extern "C" fn xmlRecoverMemory(buffer: *const c_char, size: c_int) -> *mut _xmlDoc {
2686 unsafe { xmlReadMemory(buffer, size, ptr::null(), ptr::null(), 1 << 0) }
2687}
2688
2689#[no_mangle]
2698pub unsafe extern "C" fn xmlReadMemory(
2699 buffer: *const c_char,
2700 size: c_int,
2701 URL: *const c_char,
2702 encoding: *const c_char,
2703 options: c_int,
2704) -> *mut _xmlDoc {
2705 if buffer.is_null() || size < 0 {
2709 return ptr::null_mut();
2710 }
2711 let ctxt = crate::xml::parser::helpers::create_parser_ctxt();
2712 if ctxt.is_null() {
2713 return ptr::null_mut();
2714 }
2715 let input = crate::xml::parser::helpers::input_from_memory_named(buffer, size, URL);
2718 crate::xml::parser::helpers::setup_parser_input(ctxt, input);
2719 crate::abi::exports_parser::apply_options(ctxt, options);
2723 let parsed = crate::xml::parser::helpers::parse_document(ctxt);
2724 let doc = (*ctxt).myDoc;
2725 if !doc.is_null() && !URL.is_null() && (*doc).URL.is_null() {
2728 (*doc).URL = crate::xml::string::xml_strdup(URL as *const xmlChar);
2729 }
2730 crate::xml::parser::helpers::free_parser_ctxt(ctxt);
2731 if parsed != 0 {
2732 if options & 1 << 0 != 0 {
2736 return doc;
2737 }
2738 if !doc.is_null() {
2739 crate::xml::tree::free_doc(doc);
2740 }
2741 return ptr::null_mut();
2742 }
2743 doc
2744}
2745
2746#[no_mangle]
2752pub unsafe extern "C" fn xmlLoadCatalogs(catalogs: *const c_char) {
2753 if !catalogs.is_null() {
2754 crate::xml::catalog::load_catalog(catalogs);
2755 }
2756}
2757
2758#[no_mangle]
2764pub unsafe extern "C" fn xmlLoadCatalog(catalogs: *const c_char) -> c_int {
2765 let handle = crate::xml::catalog::load_catalog(catalogs);
2768 if handle.is_null() {
2769 1
2770 } else {
2771 0
2772 }
2773}
2774
2775#[no_mangle]
2783pub unsafe extern "C" fn xmlReadFd(
2784 fd: c_int,
2785 URL: *const c_char,
2786 encoding: *const c_char,
2787 options: c_int,
2788) -> *mut _xmlDoc {
2789 let ctxt = crate::xml::parser::helpers::create_parser_ctxt();
2791 if ctxt.is_null() {
2792 return ptr::null_mut();
2793 }
2794 let mut buf = Vec::new();
2796 let mut tmp = [0u8; 4096];
2797 loop {
2798 let n = libc::read(fd, tmp.as_mut_ptr() as *mut c_void, tmp.len());
2799 if n <= 0 {
2800 break;
2801 }
2802 buf.extend_from_slice(&tmp[..n as usize]);
2803 }
2804 let input = crate::xml::parser::helpers::input_from_memory(
2805 buf.as_ptr() as *const c_char,
2806 buf.len() as c_int,
2807 );
2808 crate::xml::parser::helpers::setup_parser_input(ctxt, input);
2809 (*ctxt).options = options;
2810 if crate::xml::parser::helpers::parse_document(ctxt) != 0 {
2811 let doc = (*ctxt).myDoc;
2812 crate::xml::parser::helpers::free_parser_ctxt(ctxt);
2813 return doc;
2814 }
2815 let doc = (*ctxt).myDoc;
2816 if !doc.is_null() && !URL.is_null() {
2817 (*doc).URL = crate::xml::string::xml_strdup(URL as *const xmlChar);
2818 }
2819 crate::xml::parser::helpers::free_parser_ctxt(ctxt);
2820 doc
2821}
2822
2823#[no_mangle]
2832pub unsafe extern "C" fn xmlReadIO(
2833 ioread: Option<xmlInputReadCallback>,
2834 ioclose: Option<xmlInputCloseCallback>,
2835 ioctx: *mut c_void,
2836 URL: *const c_char,
2837 encoding: *const c_char,
2838 options: c_int,
2839) -> *mut _xmlDoc {
2840 let ctxt = crate::xml::parser::helpers::create_parser_ctxt();
2842 if ctxt.is_null() {
2843 return ptr::null_mut();
2844 }
2845 let input = crate::xml::parser::helpers::input_from_io(ioread, ioclose, ioctx);
2846 crate::xml::parser::helpers::setup_parser_input(ctxt, input);
2847 (*ctxt).options = options;
2848 if crate::xml::parser::helpers::parse_document(ctxt) != 0 {
2849 let doc = (*ctxt).myDoc;
2850 crate::xml::parser::helpers::free_parser_ctxt(ctxt);
2851 return doc;
2852 }
2853 let doc = (*ctxt).myDoc;
2854 if !doc.is_null() && !URL.is_null() {
2855 (*doc).URL = crate::xml::string::xml_strdup(URL as *const xmlChar);
2856 }
2857 crate::xml::parser::helpers::free_parser_ctxt(ctxt);
2858 doc
2859}
2860
2861#[no_mangle]
2869pub unsafe extern "C" fn xmlSAXParseDoc(
2870 sax: *mut _xmlSAXHandler,
2871 cur: *const xmlChar,
2872 recovery: c_int,
2873) -> *mut _xmlDoc {
2874 if cur.is_null() {
2876 return ptr::null_mut();
2877 }
2878 let ctxt = crate::xml::parser::helpers::create_parser_ctxt();
2879 if ctxt.is_null() {
2880 return ptr::null_mut();
2881 }
2882 if !sax.is_null() {
2883 (*ctxt).sax = sax;
2884 (*ctxt).userData = (*ctxt).sax as *mut c_void;
2885 }
2886 if recovery != 0 {
2887 (*ctxt).recovery = 1;
2888 (*ctxt).options |= 1; }
2890 let len = crate::xml::string::xml_strlen(cur);
2891 let input = crate::xml::parser::helpers::input_from_memory(cur as *const c_char, len as c_int);
2892 crate::xml::parser::helpers::setup_parser_input(ctxt, input);
2893 crate::xml::parser::helpers::parse_document(ctxt);
2894 let doc = (*ctxt).myDoc;
2895 crate::xml::parser::helpers::free_parser_ctxt(ctxt);
2896 doc
2897}
2898
2899#[no_mangle]
2909pub unsafe extern "C" fn xmlSAXParseDocWithData(
2910 sax: *mut _xmlSAXHandler,
2911 cur: *const xmlChar,
2912 recovery: c_int,
2913 data: *mut c_void,
2914) -> *mut _xmlDoc {
2915 if cur.is_null() {
2917 return ptr::null_mut();
2918 }
2919 let ctxt = crate::xml::parser::helpers::create_parser_ctxt();
2920 if ctxt.is_null() {
2921 return ptr::null_mut();
2922 }
2923 if !sax.is_null() {
2924 (*ctxt).sax = sax;
2925 }
2926 (*ctxt).userData = data;
2927 if recovery != 0 {
2928 (*ctxt).recovery = 1;
2929 (*ctxt).options |= 1; }
2931 let len = crate::xml::string::xml_strlen(cur);
2932 let input = crate::xml::parser::helpers::input_from_memory(cur as *const c_char, len as c_int);
2933 crate::xml::parser::helpers::setup_parser_input(ctxt, input);
2934 crate::xml::parser::helpers::parse_document(ctxt);
2935 let doc = (*ctxt).myDoc;
2936 crate::xml::parser::helpers::free_parser_ctxt(ctxt);
2937 doc
2938}
2939
2940#[no_mangle]
2950pub unsafe extern "C" fn xmlSAXParseFileWithData(
2951 sax: *mut _xmlSAXHandler,
2952 filename: *const c_char,
2953 recovery: c_int,
2954 data: *mut c_void,
2955) -> *mut _xmlDoc {
2956 if filename.is_null() {
2958 return ptr::null_mut();
2959 }
2960 let ctxt = crate::xml::parser::helpers::create_parser_ctxt();
2961 if ctxt.is_null() {
2962 return ptr::null_mut();
2963 }
2964 if !sax.is_null() {
2965 (*ctxt).sax = sax;
2966 }
2967 (*ctxt).userData = data;
2968 if recovery != 0 {
2969 (*ctxt).recovery = 1;
2970 (*ctxt).options |= 1; }
2972 let input = match crate::xml::parser::helpers::input_from_file(filename) {
2973 Ok(input) => input,
2974 Err(_) => {
2975 crate::xml::parser::helpers::free_parser_ctxt(ctxt);
2976 return ptr::null_mut();
2977 }
2978 };
2979 crate::xml::parser::helpers::setup_parser_input(ctxt, input);
2980 crate::xml::parser::helpers::parse_document(ctxt);
2981 let doc = (*ctxt).myDoc;
2982 crate::xml::parser::helpers::free_parser_ctxt(ctxt);
2983 doc
2984}
2985
2986#[no_mangle]
2996pub unsafe extern "C" fn xmlSAXParseMemoryWithData(
2997 sax: *mut _xmlSAXHandler,
2998 buffer: *const c_char,
2999 size: c_int,
3000 recovery: c_int,
3001 data: *mut c_void,
3002) -> *mut _xmlDoc {
3003 if buffer.is_null() || size <= 0 {
3005 return ptr::null_mut();
3006 }
3007 let ctxt = crate::xml::parser::helpers::create_parser_ctxt();
3008 if ctxt.is_null() {
3009 return ptr::null_mut();
3010 }
3011 if !sax.is_null() {
3012 (*ctxt).sax = sax;
3013 }
3014 (*ctxt).userData = data;
3015 if recovery != 0 {
3016 (*ctxt).recovery = 1;
3017 (*ctxt).options |= 1; }
3019 let input = crate::xml::parser::helpers::input_from_memory(buffer, size);
3020 crate::xml::parser::helpers::setup_parser_input(ctxt, input);
3021 crate::xml::parser::helpers::parse_document(ctxt);
3022 let doc = (*ctxt).myDoc;
3023 crate::xml::parser::helpers::free_parser_ctxt(ctxt);
3024 doc
3025}
3026
3027#[no_mangle]
3035pub unsafe extern "C" fn xmlSAXParseFile(
3036 sax: *mut _xmlSAXHandler,
3037 filename: *const c_char,
3038 recovery: c_int,
3039) -> *mut _xmlDoc {
3040 if filename.is_null() {
3042 return ptr::null_mut();
3043 }
3044 let ctxt = crate::xml::parser::helpers::create_parser_ctxt();
3045 if ctxt.is_null() {
3046 return ptr::null_mut();
3047 }
3048 if !sax.is_null() {
3049 (*ctxt).sax = sax;
3050 (*ctxt).userData = (*ctxt).sax as *mut c_void;
3051 }
3052 if recovery != 0 {
3053 (*ctxt).recovery = 1;
3054 (*ctxt).options |= 1;
3055 }
3056 let input = match crate::xml::parser::helpers::input_from_file(filename) {
3057 Ok(input) => input,
3058 Err(_) => {
3059 crate::xml::parser::helpers::free_parser_ctxt(ctxt);
3060 return ptr::null_mut();
3061 }
3062 };
3063 crate::xml::parser::helpers::setup_parser_input(ctxt, input);
3064 crate::xml::parser::helpers::parse_document(ctxt);
3065 let doc = (*ctxt).myDoc;
3066 crate::xml::parser::helpers::free_parser_ctxt(ctxt);
3067 doc
3068}
3069
3070#[no_mangle]
3079pub unsafe extern "C" fn xmlSAXParseMemory(
3080 sax: *mut _xmlSAXHandler,
3081 buffer: *const c_char,
3082 size: c_int,
3083 recovery: c_int,
3084) -> *mut _xmlDoc {
3085 if buffer.is_null() || size <= 0 {
3087 return ptr::null_mut();
3088 }
3089 let ctxt = crate::xml::parser::helpers::create_parser_ctxt();
3090 if ctxt.is_null() {
3091 return ptr::null_mut();
3092 }
3093 if !sax.is_null() {
3094 (*ctxt).sax = sax;
3095 (*ctxt).userData = (*ctxt).sax as *mut c_void;
3096 }
3097 if recovery != 0 {
3098 (*ctxt).recovery = 1;
3099 (*ctxt).options |= 1;
3100 }
3101 let input = crate::xml::parser::helpers::input_from_memory(buffer, size);
3102 crate::xml::parser::helpers::setup_parser_input(ctxt, input);
3103 crate::xml::parser::helpers::parse_document(ctxt);
3104 let doc = (*ctxt).myDoc;
3105 crate::xml::parser::helpers::free_parser_ctxt(ctxt);
3106 doc
3107}
3108
3109#[no_mangle]
3118pub unsafe extern "C" fn xmlSAXUserParseFile(
3119 sax: *mut _xmlSAXHandler,
3120 user_data: *mut c_void,
3121 filename: *const c_char,
3122) -> c_int {
3123 if filename.is_null() {
3125 return -1;
3126 }
3127 let ctxt = crate::xml::parser::helpers::create_parser_ctxt();
3128 if ctxt.is_null() {
3129 return -1;
3130 }
3131 if !sax.is_null() {
3132 (*ctxt).sax = sax;
3133 }
3134 (*ctxt).userData = if !user_data.is_null() {
3135 user_data
3136 } else {
3137 ctxt as *mut c_void
3138 };
3139 let input = match crate::xml::parser::helpers::input_from_file(filename) {
3140 Ok(input) => input,
3141 Err(_) => {
3142 crate::xml::parser::helpers::free_parser_ctxt(ctxt);
3143 return -1;
3144 }
3145 };
3146 crate::xml::parser::helpers::setup_parser_input(ctxt, input);
3147 let ret = crate::xml::parser::helpers::parse_document(ctxt);
3148 crate::xml::parser::helpers::free_parser_ctxt(ctxt);
3149 ret
3150}
3151
3152#[no_mangle]
3161pub unsafe extern "C" fn xmlSAXUserParseMemory(
3162 sax: *mut _xmlSAXHandler,
3163 user_data: *mut c_void,
3164 buffer: *const c_char,
3165 size: c_int,
3166) -> c_int {
3167 if buffer.is_null() || size <= 0 {
3169 return -1;
3170 }
3171 let ctxt = crate::xml::parser::helpers::create_parser_ctxt();
3172 if ctxt.is_null() {
3173 return -1;
3174 }
3175 if !sax.is_null() {
3176 (*ctxt).sax = sax;
3177 }
3178 (*ctxt).userData = if !user_data.is_null() {
3179 user_data
3180 } else {
3181 ctxt as *mut c_void
3182 };
3183 let input = crate::xml::parser::helpers::input_from_memory(buffer, size);
3184 crate::xml::parser::helpers::setup_parser_input(ctxt, input);
3185 let ret = crate::xml::parser::helpers::parse_document(ctxt);
3186 crate::xml::parser::helpers::free_parser_ctxt(ctxt);
3187 ret
3188}
3189
3190#[no_mangle]
3198pub unsafe extern "C" fn xmlParseDoc(cur: *const xmlChar) -> *mut _xmlDoc {
3199 if cur.is_null() {
3201 return ptr::null_mut();
3202 }
3203 xmlReadDoc(cur, ptr::null(), ptr::null(), 0)
3204}
3205
3206#[no_mangle]
3214pub unsafe extern "C" fn xmlParseFile(filename: *const c_char) -> *mut _xmlDoc {
3215 if filename.is_null() {
3217 return ptr::null_mut();
3218 }
3219 xmlReadFile(filename, ptr::null(), 0)
3220}
3221
3222#[no_mangle]
3230pub unsafe extern "C" fn xmlParseMemory(buffer: *const c_char, size: c_int) -> *mut _xmlDoc {
3231 if buffer.is_null() || size <= 0 {
3233 return ptr::null_mut();
3234 }
3235 xmlReadMemory(buffer, size, ptr::null(), ptr::null(), 0)
3236}
3237
3238#[no_mangle]
3246pub unsafe extern "C" fn xmlCreateFileParserCtxt(filename: *const c_char) -> *mut _xmlParserCtxt {
3247 if filename.is_null() {
3249 return ptr::null_mut();
3250 }
3251 let ctxt = crate::xml::parser::helpers::create_parser_ctxt();
3252 if ctxt.is_null() {
3253 return ptr::null_mut();
3254 }
3255 let input = match crate::xml::parser::helpers::input_from_file(filename) {
3256 Ok(input) => input,
3257 Err(_) => {
3258 crate::xml::parser::helpers::free_parser_ctxt(ctxt);
3259 return ptr::null_mut();
3260 }
3261 };
3262 crate::xml::parser::helpers::setup_parser_input(ctxt, input);
3263 ctxt
3264}
3265
3266#[no_mangle]
3274pub unsafe extern "C" fn xmlCreateDocParserCtxt(cur: *const xmlChar) -> *mut _xmlParserCtxt {
3275 if cur.is_null() {
3277 return ptr::null_mut();
3278 }
3279 let ctxt = crate::xml::parser::helpers::create_parser_ctxt();
3280 if ctxt.is_null() {
3281 return ptr::null_mut();
3282 }
3283 let len = crate::xml::string::xml_strlen(cur);
3284 let input = crate::xml::parser::helpers::input_from_memory(cur as *const c_char, len as c_int);
3285 crate::xml::parser::helpers::setup_parser_input(ctxt, input);
3286 ctxt
3287}
3288
3289#[no_mangle]
3297pub unsafe extern "C" fn xmlParseDocument(ctxt: *mut _xmlParserCtxt) -> c_int {
3298 if ctxt.is_null() {
3300 return -1;
3301 }
3302 crate::xml::parser::helpers::parse_document(ctxt)
3303}
3304
3305#[no_mangle]
3313pub unsafe extern "C" fn xmlFreeParserCtxt(ctxt: *mut _xmlParserCtxt) {
3314 if ctxt.is_null() {
3315 return;
3316 }
3317 crate::xml::parser::helpers::free_parser_ctxt(ctxt);
3318}
3319
3320#[no_mangle]
3328pub unsafe extern "C" fn xmlCtxtUseOptions(ctxt: *mut _xmlParserCtxt, options: c_int) -> c_int {
3329 if ctxt.is_null() {
3330 return -1;
3331 }
3332 unsafe {
3334 (*ctxt).options = options;
3335 }
3336 0
3337}
3338
3339#[no_mangle]
3348pub unsafe extern "C" fn xmlParseChunk(
3349 ctxt: *mut _xmlParserCtxt,
3350 chunk: *const c_char,
3351 size: c_int,
3352 terminate: c_int,
3353) -> c_int {
3354 if ctxt.is_null() {
3357 return -1;
3358 }
3359 crate::xml::parser::helpers::parse_chunk(ctxt, chunk, size, terminate)
3360}
3361
3362#[no_mangle]
3370pub unsafe extern "C" fn xmlParserInputBufferCreateMem(
3371 buffer: *const c_char,
3372 size: c_int,
3373 enc: c_int,
3374) -> *mut _xmlParserInputBuffer {
3375 if buffer.is_null() || size <= 0 {
3377 return ptr::null_mut();
3378 }
3379 crate::xml::parser::helpers::alloc_parser_input_buffer()
3380}
3381
3382#[no_mangle]
3390pub unsafe extern "C" fn xmlParserInputBufferCreateFilename(
3391 URI: *const c_char,
3392 enc: c_int,
3393) -> *mut _xmlParserInputBuffer {
3394 if URI.is_null() {
3396 return ptr::null_mut();
3397 }
3398 crate::xml::parser::helpers::alloc_parser_input_buffer()
3399}
3400
3401#[no_mangle]
3411pub unsafe extern "C" fn xmlParserInputBufferCreateIO(
3412 ioread: Option<xmlInputReadCallback>,
3413 ioclose: Option<xmlInputCloseCallback>,
3414 ioctx: *mut c_void,
3415 enc: c_int,
3416) -> *mut _xmlParserInputBuffer {
3417 let buf = crate::xml::parser::helpers::alloc_parser_input_buffer();
3419 if !buf.is_null() {
3420 (*buf).readcallback = ioread;
3421 (*buf).closecallback = ioclose;
3422 (*buf).context = ioctx;
3423 }
3424 buf
3425}
3426
3427#[no_mangle]
3435pub unsafe extern "C" fn xmlFreeParserInputBuffer(buf: *mut _xmlParserInputBuffer) {
3436 if buf.is_null() {
3437 return;
3438 }
3439 crate::xml::parser::helpers::free_parser_input_buffer(buf);
3440}
3441
3442#[no_mangle]
3450pub unsafe extern "C" fn xmlNewInputFromFile(
3451 ctxt: *mut _xmlParserCtxt,
3452 filename: *const c_char,
3453) -> *mut _xmlParserInput {
3454 if filename.is_null() {
3459 return ptr::null_mut();
3460 }
3461 crate::xml::parser::helpers::alloc_parser_input_buffer() as *mut _xmlParserInput
3462}
3463
3464#[no_mangle]
3472pub unsafe extern "C" fn xmlFreeInputStream(input: *mut _xmlParserInput) {
3473 if input.is_null() {
3474 return;
3475 }
3476 crate::xml::parser::helpers::free_parser_input(input);
3477}
3478
3479#[no_mangle]
3493pub unsafe extern "C" fn xmlOutputBufferCreateFilename(
3494 URI: *const c_char,
3495 encoder: *mut c_void,
3496 compression: c_int,
3497) -> *mut _xmlOutputBuffer {
3498 let _ = compression;
3499 if URI.is_null() {
3500 return ptr::null_mut();
3501 }
3502 crate::xml::io::output_buffer_create_filename(
3503 URI,
3504 encoder as *mut crate::abi::structs::_xmlCharEncodingHandler,
3505 0,
3506 )
3507}
3508
3509#[no_mangle]
3518pub unsafe extern "C" fn xmlOutputBufferCreateFd(
3519 fd: c_int,
3520 encoder: *mut c_void,
3521) -> *mut _xmlOutputBuffer {
3522 if fd < 0 {
3523 return ptr::null_mut();
3524 }
3525 crate::xml::io::output_buffer_create_fd(
3526 fd,
3527 encoder as *mut crate::abi::structs::_xmlCharEncodingHandler,
3528 )
3529}
3530
3531#[no_mangle]
3541pub unsafe extern "C" fn xmlOutputBufferCreateIO(
3542 iowrite: Option<xmlOutputWriteCallback>,
3543 ioclose: Option<xmlOutputCloseCallback>,
3544 ioctx: *mut c_void,
3545 encoder: *mut c_void,
3546) -> *mut _xmlOutputBuffer {
3547 crate::xml::io::output_buffer_create_io(
3548 iowrite,
3549 ioclose,
3550 ioctx,
3551 encoder as *mut crate::abi::structs::_xmlCharEncodingHandler,
3552 )
3553}
3554
3555#[no_mangle]
3563pub unsafe extern "C" fn xmlOutputBufferClose(out: *mut _xmlOutputBuffer) -> c_int {
3564 if out.is_null() {
3565 return -1;
3566 }
3567 crate::xml::io::output_buffer_close(out)
3568}
3569
3570#[no_mangle]
3578pub unsafe extern "C" fn xmlOutputBufferFlush(out: *mut _xmlOutputBuffer) -> c_int {
3579 if out.is_null() {
3580 return -1;
3581 }
3582 crate::xml::io::output_buffer_flush(out)
3583}
3584
3585#[no_mangle]
3593pub unsafe extern "C" fn xmlOutputBufferWrite(
3594 out: *mut _xmlOutputBuffer,
3595 len: c_int,
3596 data: *const c_char,
3597) -> c_int {
3598 if out.is_null() || data.is_null() || len <= 0 {
3599 return -1;
3600 }
3601 crate::xml::io::output_buffer_write(out, len, data)
3602}
3603
3604#[no_mangle]
3612pub unsafe extern "C" fn xmlOutputBufferWriteString(
3613 out: *mut _xmlOutputBuffer,
3614 str: *const c_char,
3615) -> c_int {
3616 if str.is_null() {
3617 return 0;
3618 }
3619 unsafe { xmlOutputBufferWrite(out, xmlStrlen(str as *const xmlChar), str) }
3620}
3621
3622#[no_mangle]
3630pub unsafe extern "C" fn xmlAllocOutputBuffer(encoder: *mut c_void) -> *mut _xmlOutputBuffer {
3631 crate::xml::io::output_buffer_create(
3632 encoder as *mut crate::abi::structs::_xmlCharEncodingHandler,
3633 )
3634}
3635
3636#[no_mangle]
3650pub unsafe extern "C" fn xmlOutputBufferCreateBuffer(
3651 buffer: *mut crate::abi::structs::_xmlBuffer,
3652 encoder: *mut c_void,
3653) -> *mut _xmlOutputBuffer {
3654 crate::xml::io::output_buffer_create_buffer(
3655 buffer,
3656 encoder as *mut crate::abi::structs::_xmlCharEncodingHandler,
3657 )
3658}
3659
3660#[no_mangle]
3668pub unsafe extern "C" fn xmlOutputBufferCreateFile(
3669 file: *mut libc::FILE,
3670 encoder: *mut c_void,
3671) -> *mut _xmlOutputBuffer {
3672 crate::xml::io::output_buffer_create_file(
3673 file,
3674 encoder as *mut crate::abi::structs::_xmlCharEncodingHandler,
3675 )
3676}
3677
3678#[no_mangle]
3684pub unsafe extern "C" fn xmlOutputBufferGetContent(out: *mut _xmlOutputBuffer) -> *const c_char {
3685 crate::xml::io::output_buffer_get_content(out) as *const c_char
3686}
3687
3688#[no_mangle]
3695pub unsafe extern "C" fn xmlOutputBufferGetSize(out: *mut _xmlOutputBuffer) -> c_int {
3696 crate::xml::io::output_buffer_get_size(out)
3697}
3698
3699#[no_mangle]
3707pub unsafe extern "C" fn xmlOutputBufferWriteEscape(
3708 out: *mut _xmlOutputBuffer,
3709 str: *const xmlChar,
3710 escaping: Option<xmlCharEncodingOutputFunc>,
3711) -> c_int {
3712 if out.is_null() || str.is_null() {
3713 return -1;
3714 }
3715 crate::xml::io::output_buffer_write_escape(out, str, escaping)
3716}
3717
3718static mut OUTPUT_CREATE_FILENAME_DEFAULT: Option<
3721 unsafe extern "C" fn(
3722 *const c_char,
3723 *mut crate::abi::structs::_xmlCharEncodingHandler,
3724 c_int,
3725 ) -> *mut _xmlOutputBuffer,
3726> = None;
3727
3728#[no_mangle]
3735pub unsafe extern "C" fn xmlOutputBufferCreateFilenameDefault(
3736 func: Option<
3737 unsafe extern "C" fn(
3738 *const c_char,
3739 *mut crate::abi::structs::_xmlCharEncodingHandler,
3740 c_int,
3741 ) -> *mut _xmlOutputBuffer,
3742 >,
3743) -> Option<
3744 unsafe extern "C" fn(
3745 *const c_char,
3746 *mut crate::abi::structs::_xmlCharEncodingHandler,
3747 c_int,
3748 ) -> *mut _xmlOutputBuffer,
3749> {
3750 let old = unsafe { OUTPUT_CREATE_FILENAME_DEFAULT };
3751 if func.is_some() {
3752 unsafe { OUTPUT_CREATE_FILENAME_DEFAULT = func };
3753 }
3754 old
3755}
3756
3757#[no_mangle]
3760pub unsafe extern "C" fn __xmlOutputBufferCreateFilename() -> *mut Option<
3761 unsafe extern "C" fn(
3762 *const c_char,
3763 *mut crate::abi::structs::_xmlCharEncodingHandler,
3764 c_int,
3765 ) -> *mut _xmlOutputBuffer,
3766> {
3767 unsafe { core::ptr::addr_of_mut!(OUTPUT_CREATE_FILENAME_DEFAULT) }
3768}
3769
3770#[no_mangle]
3782pub extern "C" fn xmlDictCreate() -> *mut c_void {
3783 let d = unsafe { crate::xml::dictionary::dict_create() as *mut c_void };
3784 if !d.is_null() {
3785 *crate::abi::exports_hash::DICT_REFS
3789 .lock()
3790 .entry(d as usize)
3791 .or_insert(0) = 1;
3792 }
3793 d
3794}
3795
3796#[no_mangle]
3804pub extern "C" fn xmlDictCreateSub(sub: *mut c_void) -> *mut c_void {
3805 let d = unsafe {
3806 crate::xml::dictionary::dict_create_sub(sub as *mut crate::xml::dictionary::Dict)
3807 as *mut c_void
3808 };
3809 if !d.is_null() {
3810 *crate::abi::exports_hash::DICT_REFS
3811 .lock()
3812 .entry(d as usize)
3813 .or_insert(0) = 1;
3814 }
3815 d
3816}
3817
3818#[no_mangle]
3830pub unsafe extern "C" fn xmlDictLookup(
3831 dict: *mut c_void,
3832 name: *const xmlChar,
3833 len: c_int,
3834) -> *const xmlChar {
3835 unsafe {
3836 crate::xml::dictionary::dict_lookup(dict as *mut crate::xml::dictionary::Dict, name, len)
3837 }
3838}
3839
3840#[no_mangle]
3848pub unsafe extern "C" fn xmlDictExists(
3849 dict: *mut c_void,
3850 name: *const xmlChar,
3851 len: c_int,
3852) -> *const xmlChar {
3853 unsafe {
3854 crate::xml::dictionary::dict_exists(dict as *mut crate::xml::dictionary::Dict, name, len)
3855 }
3856}
3857
3858#[no_mangle]
3866pub extern "C" fn xmlDictSize(dict: *const c_void) -> c_uint {
3867 unsafe {
3868 crate::xml::dictionary::dict_size(dict as *const crate::xml::dictionary::Dict) as c_uint
3869 }
3870}
3871
3872#[no_mangle]
3884pub extern "C" fn xmlDictFree(dict: *mut c_void) {
3885 if dict.is_null() {
3886 return;
3887 }
3888 let mut remaining = 0u32;
3889 {
3890 let mut refs = crate::abi::exports_hash::DICT_REFS.lock();
3891 if let Some(r) = refs.get_mut(&(dict as usize)) {
3892 if *r > 0 {
3893 *r -= 1;
3894 }
3895 remaining = *r;
3896 if remaining == 0 {
3897 refs.remove(&(dict as usize));
3898 }
3899 }
3900 }
3901 if remaining == 0 {
3902 unsafe { crate::xml::dictionary::dict_free(dict as *mut crate::xml::dictionary::Dict) };
3903 }
3904}
3905
3906#[no_mangle]
3914pub extern "C" fn xmlDictSetLimit(dict: *mut c_void, limit: c_uint) -> c_uint {
3915 unsafe {
3916 crate::xml::dictionary::dict_set_limit(
3917 dict as *mut crate::xml::dictionary::Dict,
3918 limit as usize,
3919 ) as c_uint
3920 }
3921}
3922
3923#[no_mangle]
3931pub extern "C" fn xmlDictGetUsage(dict: *const c_void) -> c_uint {
3932 unsafe {
3933 crate::xml::dictionary::dict_get_usage(dict as *mut crate::xml::dictionary::Dict) as c_uint
3934 }
3935}
3936
3937#[no_mangle]
3949pub extern "C" fn xmlHashCreate(size: c_int) -> *mut c_void {
3950 unsafe { crate::xml::hash::hash_create(size) as *mut c_void }
3951}
3952
3953#[no_mangle]
3961pub extern "C" fn xmlHashCreateDict(size: c_int, dict: *mut c_void) -> *mut c_void {
3962 unsafe { crate::xml::hash::hash_create_dict(size, dict) as *mut c_void }
3963}
3964
3965#[no_mangle]
3973pub extern "C" fn xmlHashFree(
3974 table: *mut c_void,
3975 f: Option<unsafe extern "C" fn(*mut c_void, *mut xmlChar)>,
3976) {
3977 unsafe { crate::xml::hash::hash_free(table as *mut crate::xml::hash::HashTable, f) }
3978}
3979
3980#[no_mangle]
3988pub unsafe extern "C" fn xmlHashAddEntry(
3989 table: *mut c_void,
3990 name: *const xmlChar,
3991 userdata: *mut c_void,
3992) -> c_int {
3993 unsafe {
3994 crate::xml::hash::hash_add_entry(table as *mut crate::xml::hash::HashTable, name, userdata)
3995 }
3996}
3997
3998#[no_mangle]
4007pub unsafe extern "C" fn xmlHashAddEntry2(
4008 table: *mut c_void,
4009 name: *const xmlChar,
4010 name2: *const xmlChar,
4011 userdata: *mut c_void,
4012) -> c_int {
4013 unsafe {
4014 crate::xml::hash::hash_add_entry2(
4015 table as *mut crate::xml::hash::HashTable,
4016 name,
4017 name2,
4018 userdata,
4019 )
4020 }
4021}
4022
4023#[no_mangle]
4032pub unsafe extern "C" fn xmlHashAddEntry3(
4033 table: *mut c_void,
4034 name: *const xmlChar,
4035 name2: *const xmlChar,
4036 name3: *const xmlChar,
4037 userdata: *mut c_void,
4038) -> c_int {
4039 unsafe {
4040 crate::xml::hash::hash_add_entry3(
4041 table as *mut crate::xml::hash::HashTable,
4042 name,
4043 name2,
4044 name3,
4045 userdata,
4046 )
4047 }
4048}
4049
4050#[no_mangle]
4059pub unsafe extern "C" fn xmlHashUpdateEntry(
4060 table: *mut c_void,
4061 name: *const xmlChar,
4062 userdata: *mut c_void,
4063 f: Option<unsafe extern "C" fn(*mut c_void, *mut xmlChar)>,
4064) -> c_int {
4065 unsafe {
4066 crate::xml::hash::hash_update_entry(
4067 table as *mut crate::xml::hash::HashTable,
4068 name,
4069 userdata,
4070 f,
4071 )
4072 }
4073}
4074
4075#[no_mangle]
4077pub unsafe extern "C" fn xmlHashUpdateEntry2(
4078 table: *mut c_void,
4079 name: *const xmlChar,
4080 name2: *const xmlChar,
4081 userdata: *mut c_void,
4082 f: Option<unsafe extern "C" fn(*mut c_void, *mut xmlChar)>,
4083) -> c_int {
4084 unsafe {
4085 crate::xml::hash::hash_update_entry2(
4086 table as *mut crate::xml::hash::HashTable,
4087 name,
4088 name2,
4089 userdata,
4090 f,
4091 )
4092 }
4093}
4094
4095#[no_mangle]
4097pub unsafe extern "C" fn xmlHashUpdateEntry3(
4098 table: *mut c_void,
4099 name: *const xmlChar,
4100 name2: *const xmlChar,
4101 name3: *const xmlChar,
4102 userdata: *mut c_void,
4103 f: Option<unsafe extern "C" fn(*mut c_void, *mut xmlChar)>,
4104) -> c_int {
4105 unsafe {
4106 crate::xml::hash::hash_update_entry3(
4107 table as *mut crate::xml::hash::HashTable,
4108 name,
4109 name2,
4110 name3,
4111 userdata,
4112 f,
4113 )
4114 }
4115}
4116
4117#[no_mangle]
4125pub unsafe extern "C" fn xmlHashLookup(table: *mut c_void, name: *const xmlChar) -> *mut c_void {
4126 unsafe { crate::xml::hash::hash_lookup(table as *mut crate::xml::hash::HashTable, name) }
4127}
4128
4129#[no_mangle]
4131pub unsafe extern "C" fn xmlHashLookup2(
4132 table: *mut c_void,
4133 name: *const xmlChar,
4134 name2: *const xmlChar,
4135) -> *mut c_void {
4136 unsafe {
4137 crate::xml::hash::hash_lookup2(table as *mut crate::xml::hash::HashTable, name, name2)
4138 }
4139}
4140
4141#[no_mangle]
4143pub unsafe extern "C" fn xmlHashLookup3(
4144 table: *mut c_void,
4145 name: *const xmlChar,
4146 name2: *const xmlChar,
4147 name3: *const xmlChar,
4148) -> *mut c_void {
4149 unsafe {
4150 crate::xml::hash::hash_lookup3(
4151 table as *mut crate::xml::hash::HashTable,
4152 name,
4153 name2,
4154 name3,
4155 )
4156 }
4157}
4158
4159#[no_mangle]
4167pub extern "C" fn xmlHashSize(table: *mut c_void) -> c_int {
4168 unsafe { crate::xml::hash::hash_size(table as *mut crate::xml::hash::HashTable) }
4169}
4170
4171#[no_mangle]
4180pub unsafe extern "C" fn xmlHashRemoveEntry(
4181 table: *mut c_void,
4182 name: *const xmlChar,
4183 f: Option<unsafe extern "C" fn(*mut c_void, *mut xmlChar)>,
4184) -> c_int {
4185 unsafe {
4186 crate::xml::hash::hash_remove_entry(table as *mut crate::xml::hash::HashTable, name, f)
4187 }
4188}
4189
4190#[no_mangle]
4192pub unsafe extern "C" fn xmlHashRemoveEntry2(
4193 table: *mut c_void,
4194 name: *const xmlChar,
4195 name2: *const xmlChar,
4196 f: Option<unsafe extern "C" fn(*mut c_void, *mut xmlChar)>,
4197) -> c_int {
4198 unsafe {
4199 crate::xml::hash::hash_remove_entry2(
4200 table as *mut crate::xml::hash::HashTable,
4201 name,
4202 name2,
4203 f,
4204 )
4205 }
4206}
4207
4208#[no_mangle]
4210pub unsafe extern "C" fn xmlHashRemoveEntry3(
4211 table: *mut c_void,
4212 name: *const xmlChar,
4213 name2: *const xmlChar,
4214 name3: *const xmlChar,
4215 f: Option<unsafe extern "C" fn(*mut c_void, *mut xmlChar)>,
4216) -> c_int {
4217 unsafe {
4218 crate::xml::hash::hash_remove_entry3(
4219 table as *mut crate::xml::hash::HashTable,
4220 name,
4221 name2,
4222 name3,
4223 f,
4224 )
4225 }
4226}
4227
4228#[no_mangle]
4236pub extern "C" fn xmlHashScan(table: *mut c_void, f: Option<xmlHashScanner>, data: *mut c_void) {
4237 unsafe { crate::xml::hash::hash_scan(table as *mut crate::xml::hash::HashTable, f, data) }
4238}
4239
4240#[no_mangle]
4242pub extern "C" fn xmlHashScanFull(
4243 table: *mut c_void,
4244 f: Option<xmlHashScannerFull>,
4245 data: *mut c_void,
4246) {
4247 unsafe { crate::xml::hash::hash_scan_full(table as *mut crate::xml::hash::HashTable, f, data) }
4248}
4249
4250#[no_mangle]
4258pub extern "C" fn xmlHashCopy(
4259 table: *mut c_void,
4260 f: Option<unsafe extern "C" fn(*mut c_void, *const xmlChar) -> *mut c_void>,
4261) -> *mut c_void {
4262 unsafe {
4263 crate::xml::hash::hash_copy(table as *mut crate::xml::hash::HashTable, f) as *mut c_void
4264 }
4265}
4266
4267#[no_mangle]
4280pub extern "C" fn xmlListCreate(
4281 deallocator: Option<unsafe extern "C" fn(*mut c_void)>,
4282 compare: Option<unsafe extern "C" fn(*const c_void, *const c_void) -> c_int>,
4283) -> *mut c_void {
4284 unsafe { crate::xml::list::list_create(deallocator, compare) as *mut c_void }
4285}
4286
4287#[no_mangle]
4295pub extern "C" fn xmlListDelete(list: *mut c_void) {
4296 unsafe { crate::xml::list::list_delete(list as *mut crate::xml::list::List) }
4297}
4298
4299#[no_mangle]
4307pub extern "C" fn xmlListSearch(list: *mut c_void, data: *mut c_void) -> *mut c_void {
4308 unsafe { crate::xml::list::list_search(list as *mut crate::xml::list::List, data) }
4309}
4310
4311#[no_mangle]
4319pub extern "C" fn xmlListWalk(
4320 list: *mut c_void,
4321 walker: Option<unsafe extern "C" fn(*mut c_void, *mut c_void) -> c_int>,
4322 data: *mut c_void,
4323) {
4324 unsafe { crate::xml::list::list_walk(list as *mut crate::xml::list::List, walker, data) }
4325}
4326
4327#[no_mangle]
4335pub extern "C" fn xmlListPushBack(list: *mut c_void, data: *mut c_void) -> c_int {
4336 unsafe { crate::xml::list::list_push_back(list as *mut crate::xml::list::List, data) }
4337}
4338
4339#[no_mangle]
4347pub extern "C" fn xmlListPushFront(list: *mut c_void, data: *mut c_void) -> c_int {
4348 unsafe { crate::xml::list::list_push_front(list as *mut crate::xml::list::List, data) }
4349}
4350
4351#[no_mangle]
4353pub extern "C" fn xmlListPopBack(list: *mut c_void) {
4354 unsafe { crate::xml::list::list_pop_back(list as *mut crate::xml::list::List) }
4355}
4356
4357#[no_mangle]
4359pub extern "C" fn xmlListPopFront(list: *mut c_void) {
4360 unsafe { crate::xml::list::list_pop_front(list as *mut crate::xml::list::List) }
4361}
4362
4363#[no_mangle]
4371pub extern "C" fn xmlListInsert(list: *mut c_void, data: *mut c_void) -> c_int {
4372 unsafe { crate::xml::list::list_insert(list as *mut crate::xml::list::List, data) }
4373}
4374
4375#[no_mangle]
4377pub extern "C" fn xmlListAppend(list: *mut c_void, data: *mut c_void) -> c_int {
4378 unsafe { crate::xml::list::list_append(list as *mut crate::xml::list::List, data) }
4379}
4380
4381#[no_mangle]
4383pub extern "C" fn xmlListRemoveFirst(list: *mut c_void, data: *mut c_void) -> c_int {
4384 unsafe { crate::xml::list::list_remove_first(list as *mut crate::xml::list::List, data) }
4385}
4386
4387#[no_mangle]
4389pub extern "C" fn xmlListRemoveLast(list: *mut c_void, data: *mut c_void) -> c_int {
4390 unsafe { crate::xml::list::list_remove_last(list as *mut crate::xml::list::List, data) }
4391}
4392
4393#[no_mangle]
4395pub extern "C" fn xmlListRemoveAll(list: *mut c_void, data: *mut c_void) -> c_int {
4396 unsafe { crate::xml::list::list_remove_all(list as *mut crate::xml::list::List, data) }
4397}
4398
4399#[no_mangle]
4401pub extern "C" fn xmlListClear(list: *mut c_void) {
4402 unsafe { crate::xml::list::list_clear(list as *mut crate::xml::list::List) }
4403}
4404
4405#[no_mangle]
4413pub extern "C" fn xmlListEmpty(list: *mut c_void) -> c_int {
4414 unsafe { crate::xml::list::list_empty(list as *mut crate::xml::list::List) }
4415}
4416
4417#[no_mangle]
4425pub extern "C" fn xmlListFront(list: *mut c_void) -> *mut c_void {
4426 unsafe { crate::xml::list::list_front(list as *mut crate::xml::list::List) }
4427}
4428
4429#[no_mangle]
4437pub extern "C" fn xmlListBack(list: *mut c_void) -> *mut c_void {
4438 unsafe { crate::xml::list::list_back(list as *mut crate::xml::list::List) }
4439}
4440
4441#[no_mangle]
4449pub extern "C" fn xmlListSize(list: *mut c_void) -> c_int {
4450 unsafe { crate::xml::list::list_size(list as *mut crate::xml::list::List) }
4451}
4452
4453#[no_mangle]
4455pub extern "C" fn xmlListSort(list: *mut c_void) {
4456 unsafe { crate::xml::list::list_sort(list as *mut crate::xml::list::List) }
4457}
4458
4459#[no_mangle]
4461pub extern "C" fn xmlListReverse(list: *mut c_void) {
4462 unsafe { crate::xml::list::list_reverse(list as *mut crate::xml::list::List) }
4463}
4464
4465#[no_mangle]
4467pub extern "C" fn xmlListReverseSplice(list: *mut c_void, list2: *mut c_void) {
4468 unsafe {
4469 crate::xml::list::list_reverse_splice(
4470 list as *mut crate::xml::list::List,
4471 list2 as *mut crate::xml::list::List,
4472 )
4473 }
4474}
4475
4476#[no_mangle]
4478pub extern "C" fn xmlListMerge(list: *mut c_void, list2: *mut c_void) {
4479 unsafe {
4480 crate::xml::list::list_merge(
4481 list as *mut crate::xml::list::List,
4482 list2 as *mut crate::xml::list::List,
4483 )
4484 }
4485}
4486#[no_mangle]
4494pub unsafe extern "C" fn xmlListEnd(l: *mut c_void) -> *mut c_void {
4495 crate::xml::list::list_end(l as *mut crate::xml::list::List)
4496}
4497
4498#[no_mangle]
4506pub unsafe extern "C" fn xmlListReverseSearch(l: *mut c_void, data: *mut c_void) -> *mut c_void {
4507 crate::xml::list::list_reverse_search(l as *mut crate::xml::list::List, data)
4508}
4509
4510#[no_mangle]
4518pub unsafe extern "C" fn xmlListReverseWalk(
4519 l: *mut c_void,
4520 walker: Option<unsafe extern "C" fn(*mut c_void, *mut c_void) -> c_int>,
4521 data: *mut c_void,
4522) {
4523 crate::xml::list::list_reverse_walk(l as *mut crate::xml::list::List, walker, data)
4524}
4525
4526#[no_mangle]
4534pub unsafe extern "C" fn xmlListDup(l: *mut c_void) -> *mut c_void {
4535 crate::xml::list::list_dup(l as *mut crate::xml::list::List) as *mut c_void
4536}
4537
4538#[no_mangle]
4546pub unsafe extern "C" fn xmlListCopy(
4547 l: *mut c_void,
4548 copier: Option<unsafe extern "C" fn(*mut c_void) -> *mut c_void>,
4549) -> c_int {
4550 crate::xml::list::list_copy(l as *mut crate::xml::list::List, copier)
4551}
4552
4553#[no_mangle]
4561pub unsafe extern "C" fn xmlLinkGetData(lk: *mut c_void) -> *mut c_void {
4562 crate::xml::list::link_get_data(lk)
4563}
4564
4565#[no_mangle]
4577pub extern "C" fn xmlBufferCreate() -> *mut _xmlBuffer {
4578 crate::xml::io::buf_create(-1)
4579}
4580
4581#[no_mangle]
4589pub extern "C" fn xmlBufferCreateSize(size: usize) -> *mut _xmlBuffer {
4590 crate::xml::io::buf_create(size as c_int)
4591}
4592
4593#[no_mangle]
4601pub extern "C" fn xmlBufferCreateStatic(mem: *mut c_void, size: usize) -> *mut _xmlBuffer {
4602 if mem.is_null() || size == 0 {
4603 return ptr::null_mut();
4604 }
4605 crate::xml::io::buf_create_static(mem as *const xmlChar, size as c_int)
4606}
4607
4608#[no_mangle]
4616pub extern "C" fn xmlBufferFree(buf: *mut _xmlBuffer) {
4617 crate::xml::io::buf_free(buf)
4618}
4619
4620#[no_mangle]
4628pub extern "C" fn xmlBufferEmpty(buf: *mut _xmlBuffer) {
4629 if buf.is_null() {
4630 return;
4631 }
4632 unsafe {
4633 if !(*buf).content.is_null() {
4634 *(*buf).content = 0;
4635 }
4636 (*buf).use_ = 0;
4637 }
4638}
4639
4640#[no_mangle]
4648pub extern "C" fn xmlBufferContent(buf: *const _xmlBuffer) -> *mut xmlChar {
4649 crate::xml::io::buf_content(buf as *mut _xmlBuffer)
4650}
4651
4652#[no_mangle]
4660pub extern "C" fn xmlBufferLength(buf: *const _xmlBuffer) -> c_int {
4661 crate::xml::io::buf_length(buf as *mut _xmlBuffer)
4662}
4663
4664#[no_mangle]
4672pub unsafe extern "C" fn xmlBufferAdd(
4673 buf: *mut _xmlBuffer,
4674 str: *const xmlChar,
4675 len: c_int,
4676) -> c_int {
4677 crate::xml::io::buf_add(buf, str, len)
4678}
4679
4680#[no_mangle]
4688pub unsafe extern "C" fn xmlBufferAddHead(
4689 buf: *mut _xmlBuffer,
4690 str: *const xmlChar,
4691 len: c_int,
4692) -> c_int {
4693 crate::xml::io::buf_add_head(buf, str, len)
4694}
4695
4696#[no_mangle]
4704pub unsafe extern "C" fn xmlBufferCat(buf: *mut _xmlBuffer, str: *const xmlChar) -> c_int {
4705 if str.is_null() {
4706 return -1;
4707 }
4708 let len = crate::xml::string::xml_strlen(str) as c_int;
4709 crate::xml::io::buf_add(buf, str, len)
4710}
4711
4712#[no_mangle]
4721pub extern "C" fn xmlBufferSetAllocationScheme(buf: *mut _xmlBuffer, scheme: c_int) {
4722 if buf.is_null() {
4723 return;
4724 }
4725 unsafe {
4726 (*buf).alloc = scheme;
4727 }
4728}
4729
4730#[no_mangle]
4738pub extern "C" fn xmlBufferShrink(buf: *mut _xmlBuffer, len: c_int) -> c_int {
4739 if buf.is_null() || len <= 0 {
4740 return 0;
4741 }
4742 unsafe {
4743 let b = &mut *buf;
4744 let shrink_len = (len as c_uint).min(b.use_);
4745 if shrink_len > 0 {
4746 let remaining = b.use_ - shrink_len;
4747 if remaining > 0 {
4748 core::ptr::copy(
4749 b.content.add(shrink_len as usize),
4750 b.content,
4751 remaining as usize,
4752 );
4753 }
4754 *b.content.add(remaining as usize) = 0;
4755 b.use_ = remaining;
4756 }
4757 }
4758 len
4759}
4760
4761#[no_mangle]
4769pub extern "C" fn xmlBufferGrow(buf: *mut _xmlBuffer, len: c_int) -> c_int {
4770 if buf.is_null() || len <= 0 {
4771 return 0;
4772 }
4773 let cur_use = unsafe { (*buf).use_ };
4774 let new_size = cur_use + len as c_uint + 1;
4775 crate::xml::io::buf_grow(buf, new_size)
4776}
4777
4778#[no_mangle]
4786pub extern "C" fn xmlBufferReserve(buf: *mut _xmlBuffer, len: c_int) -> c_int {
4787 xmlBufferGrow(buf, len)
4788}
4789
4790#[no_mangle]
4798pub extern "C" fn xmlBufferDetach(buf: *mut _xmlBuffer) -> *mut xmlChar {
4799 if buf.is_null() {
4800 return ptr::null_mut();
4801 }
4802 unsafe {
4803 let content = (*buf).content;
4804 (*buf).content = ptr::null_mut();
4805 (*buf).use_ = 0;
4806 (*buf).size = 0;
4807 content
4808 }
4809}
4810
4811#[no_mangle]
4823pub extern "C" fn xmlGetCharEncoding(name: *const c_char) -> c_int {
4824 if name.is_null() {
4825 return 0; }
4827 let name_bytes = unsafe {
4828 let len = libc::strlen(name);
4829 core::slice::from_raw_parts(name as *const u8, len)
4830 };
4831 crate::xml::encoding::encoding_from_name(name_bytes) as c_int
4832}
4833
4834#[no_mangle]
4842pub extern "C" fn xmlFindCharEncodingHandler(name: *const c_char) -> *mut c_void {
4843 if name.is_null() {
4844 return ptr::null_mut();
4845 }
4846 crate::xml::encoding::find_encoding_handler(name as *const xmlChar) as *mut c_void
4847}
4848
4849#[no_mangle]
4857pub extern "C" fn xmlCharEncCloseFunc(handler: *mut c_void) -> c_int {
4858 if handler.is_null() {
4859 return -1;
4860 }
4861 unsafe {
4863 let h = handler as *mut crate::abi::structs::_xmlCharEncodingHandler;
4864 if !(*h).name.is_null() {
4865 crate::abi::allocator::xmlFreeImpl((*h).name as *mut c_void);
4866 }
4867 crate::abi::allocator::xmlFreeImpl(handler);
4868 }
4869 0
4870}
4871
4872#[no_mangle]
4882pub unsafe extern "C" fn xmlIsolat1ToUTF8(
4883 out: *mut u8,
4884 outlen: *mut c_int,
4885 input: *const u8,
4886 inlen: *mut c_int,
4887) -> c_int {
4888 const XML_ENC_ERR_SPACE: c_int = -2;
4890 const XML_ENC_ERR_INTERNAL: c_int = -1;
4891 unsafe {
4892 if out.is_null() || input.is_null() || outlen.is_null() || inlen.is_null() {
4893 return XML_ENC_ERR_INTERNAL;
4894 }
4895 let outstart = out;
4896 let instart = input;
4897 let outend = out.add(*outlen as usize);
4898 let inend = input.add(*inlen as usize);
4899 let mut cur = input;
4900 let mut o = out;
4901 while cur < inend {
4902 let c = *cur;
4903 if c < 0x80 {
4904 if o >= outend {
4905 break;
4906 }
4907 *o = c;
4908 o = o.add(1);
4909 } else {
4910 if (outend as usize) - (o as usize) < 2 {
4911 break;
4912 }
4913 *o = (c >> 6) | 0xC0;
4914 *o.add(1) = (c & 0x3F) | 0x80;
4915 o = o.add(2);
4916 }
4917 cur = cur.add(1);
4918 }
4919 let mut ret = XML_ENC_ERR_SPACE;
4920 if cur == inend {
4921 ret = (o as usize - outstart as usize) as c_int;
4922 }
4923 *outlen = (o as usize - outstart as usize) as c_int;
4924 *inlen = (cur as usize - instart as usize) as c_int;
4925 ret
4926 }
4927}
4928
4929#[no_mangle]
4936pub unsafe extern "C" fn xmlUTF8ToIsolat1(
4937 out: *mut u8,
4938 outlen: *mut c_int,
4939 input: *const u8,
4940 inlen: *mut c_int,
4941) -> c_int {
4942 const XML_ENC_ERR_SPACE: c_int = -2;
4943 const XML_ENC_ERR_INTERNAL: c_int = -1;
4944 const XML_ENC_ERR_INPUT: c_int = -3;
4945 const XML_ENC_ERR_SUCCESS: c_int = 0;
4946 unsafe {
4947 if out.is_null() || outlen.is_null() || inlen.is_null() {
4948 return XML_ENC_ERR_INTERNAL;
4949 }
4950 if input.is_null() {
4951 *inlen = 0;
4952 *outlen = 0;
4953 return XML_ENC_ERR_SUCCESS;
4954 }
4955 let outstart = out;
4956 let instart = input;
4957 let outend = out.add(*outlen as usize);
4958 let inend = input.add(*inlen as usize);
4959 let mut cur = input;
4960 let mut o = out;
4961 let mut ret = XML_ENC_ERR_SPACE;
4962 while cur < inend {
4963 if o >= outend {
4964 break;
4965 }
4966 let c = *cur;
4967 if c < 0x80 {
4968 *o = c;
4969 o = o.add(1);
4970 } else if c >= 0xC2 && c <= 0xC3 {
4971 if (inend as usize) - (cur as usize) < 2 {
4972 break;
4973 }
4974 cur = cur.add(1);
4975 *o = (c << 6) | (*cur & 0x3F);
4976 o = o.add(1);
4977 } else {
4978 ret = XML_ENC_ERR_INPUT;
4979 break;
4980 }
4981 cur = cur.add(1);
4982 }
4983 if ret != XML_ENC_ERR_INPUT {
4984 ret = (o as usize - outstart as usize) as c_int;
4985 }
4986 *outlen = (o as usize - outstart as usize) as c_int;
4987 *inlen = (cur as usize - instart as usize) as c_int;
4988 ret
4989 }
4990}
4991
4992#[no_mangle]
5000pub extern "C" fn xmlGetCharEncodingName(enc: c_int) -> *const c_char {
5001 if enc < -1 || enc > 22 {
5005 return match enc {
5006 23 => c"UTF-16".as_ptr(),
5007 24 => c"HTML".as_ptr(),
5008 31 => c"windows-1252".as_ptr(),
5009 _ => ptr::null(),
5010 };
5011 }
5012 let e: crate::abi::types::xmlCharEncoding = unsafe { core::mem::transmute(enc) };
5013 crate::xml::encoding::xmlGetCharEncodingName(e)
5014}
5015
5016#[no_mangle]
5026pub extern "C" fn xmlParseCharEncoding(name: *const c_char) -> c_int {
5027 crate::xml::encoding::xmlParseCharEncoding(name)
5028}
5029
5030#[no_mangle]
5038pub extern "C" fn xmlAddEncodingAlias(name: *const c_char, alias: *const c_char) -> c_int {
5039 crate::xml::encoding::add_encoding_alias(name, alias)
5040}
5041
5042#[no_mangle]
5050pub extern "C" fn xmlDelEncodingAlias(alias: *const c_char) -> c_int {
5051 crate::xml::encoding::del_encoding_alias(alias)
5052}
5053
5054#[no_mangle]
5062pub extern "C" fn xmlGetEncodingAlias(alias: *const c_char) -> *const c_char {
5063 crate::xml::encoding::get_encoding_alias(alias)
5064}
5065
5066#[no_mangle]
5074pub extern "C" fn xmlCleanupEncodingAliases() {
5075 crate::xml::encoding::cleanup_encoding_aliases();
5076}
5077
5078#[no_mangle]
5087pub extern "C" fn xmlCharEncInFunc(
5088 handler: *mut c_void,
5089 out: *mut c_void,
5090 in_: *mut c_void,
5091) -> c_int {
5092 crate::xml::encoding::xmlCharEncInFunc(
5093 handler as *mut crate::abi::structs::_xmlCharEncodingHandler,
5094 out as *mut crate::abi::structs::_xmlBuffer,
5095 in_ as *mut crate::abi::structs::_xmlBuffer,
5096 )
5097}
5098
5099#[no_mangle]
5108pub extern "C" fn xmlCharEncOutFunc(
5109 handler: *mut c_void,
5110 out: *mut c_void,
5111 in_: *mut c_void,
5112) -> c_int {
5113 crate::xml::encoding::xmlCharEncOutFunc(
5114 handler as *mut crate::abi::structs::_xmlCharEncodingHandler,
5115 out as *mut crate::abi::structs::_xmlBuffer,
5116 in_ as *mut crate::abi::structs::_xmlBuffer,
5117 )
5118}
5119
5120#[no_mangle]
5130pub extern "C" fn xmlNewCharEncodingHandler(
5131 name: *const c_char,
5132 input: crate::abi::callbacks::xmlCharEncodingInputFunc,
5133 output: crate::abi::callbacks::xmlCharEncodingOutputFunc,
5134) -> *mut c_void {
5135 crate::xml::encoding::xmlNewCharEncodingHandler(name, input, output) as *mut c_void
5136}
5137
5138#[no_mangle]
5146pub extern "C" fn xmlInitCharEncodingHandlers() {
5147 crate::xml::encoding::xmlInitCharEncodingHandlers();
5148}
5149
5150#[no_mangle]
5158pub extern "C" fn xmlCleanupCharEncodingHandlers() {
5159 crate::xml::encoding::xmlCleanupCharEncodingHandlers();
5160}
5161
5162#[no_mangle]
5174pub extern "C" fn xmlLookupCharEncodingHandler(enc: c_int, out: *mut *mut c_void) -> c_int {
5175 crate::xml::encoding::xmlLookupCharEncodingHandler(enc, out)
5176}
5177
5178#[no_mangle]
5186pub extern "C" fn xmlGetCharEncodingHandler(enc: c_int) -> *mut c_void {
5187 crate::xml::encoding::xmlGetCharEncodingHandler(enc)
5188}
5189
5190#[no_mangle]
5199pub extern "C" fn xmlOpenCharEncodingHandler(
5200 name: *const c_char,
5201 output: c_int,
5202 out: *mut *mut c_void,
5203) -> c_int {
5204 crate::xml::encoding::xmlOpenCharEncodingHandler(name, output, out)
5205}
5206
5207#[no_mangle]
5218pub extern "C" fn xmlCreateCharEncodingHandler(
5219 name: *const c_char,
5220 flags: c_int,
5221 impl_: Option<crate::abi::callbacks::xmlCharEncConvImpl>,
5222 implCtxt: *mut c_void,
5223 out: *mut *mut c_void,
5224) -> c_int {
5225 crate::xml::encoding::xmlCreateCharEncodingHandler(name, flags, impl_, implCtxt, out)
5226}
5227
5228#[no_mangle]
5239pub extern "C" fn xmlCharEncNewCustomHandler(
5240 name: *const c_char,
5241 input: crate::abi::callbacks::xmlCharEncConvFunc,
5242 output: crate::abi::callbacks::xmlCharEncConvFunc,
5243 ctxtDtor: Option<crate::abi::callbacks::xmlCharEncConvCtxtDtor>,
5244 inputCtxt: *mut c_void,
5245 outputCtxt: *mut c_void,
5246 out: *mut *mut c_void,
5247) -> c_int {
5248 crate::xml::encoding::xmlCharEncNewCustomHandler(
5249 name, input, output, ctxtDtor, inputCtxt, outputCtxt, out,
5250 )
5251}
5252
5253#[no_mangle]
5261pub unsafe extern "C" fn xmlCharEncInput(input: *mut _xmlParserInputBuffer, _to: c_int) -> c_int {
5262 if input.is_null() {
5263 return -1;
5264 }
5265 let handler = (*input).encoder as *mut crate::abi::structs::_xmlCharEncodingHandler;
5266 if handler.is_null() {
5267 return -1;
5268 }
5269 let raw = (*input).raw as *mut crate::abi::structs::_xmlBuffer;
5270 let buf = (*input).buffer as *mut crate::abi::structs::_xmlBuffer;
5271 if raw.is_null() || buf.is_null() {
5272 return -1;
5273 }
5274 crate::xml::encoding::char_enc_in(handler, buf, raw)
5275}
5276
5277#[no_mangle]
5285pub unsafe extern "C" fn xmlCharEncOutput(output: *mut _xmlOutputBuffer, _to: c_int) -> c_int {
5286 if output.is_null() {
5287 return -1;
5288 }
5289 let handler = (*output).encoder as *mut crate::abi::structs::_xmlCharEncodingHandler;
5290 if handler.is_null() {
5291 return -1;
5292 }
5293 let buf = (*output).buffer as *mut crate::abi::structs::_xmlBuffer;
5294 let conv = (*output).conv as *mut crate::abi::structs::_xmlBuffer;
5295 if buf.is_null() || conv.is_null() {
5296 return -1;
5297 }
5298 crate::xml::encoding::char_enc_out(handler, conv, buf)
5299}
5300
5301#[no_mangle]
5313pub unsafe extern "C" fn xmlParseURI(str: *const c_char) -> *mut c_void {
5314 crate::xml::uri::xmlParseURI(str)
5315}
5316
5317#[no_mangle]
5325pub unsafe extern "C" fn xmlParseURIRaw(str: *const c_char, raw: c_int) -> *mut c_void {
5326 let _ = raw;
5327 crate::xml::uri::xmlParseURI(str)
5328}
5329
5330#[no_mangle]
5338pub unsafe extern "C" fn xmlFreeURI(uri: *mut c_void) {
5339 crate::xml::uri::xmlFreeURI(uri)
5340}
5341
5342#[no_mangle]
5350pub extern "C" fn xmlCreateURI() -> *mut c_void {
5351 crate::xml::uri::xmlCreateURI()
5352}
5353
5354#[no_mangle]
5362pub unsafe extern "C" fn xmlSaveUri(uri: *mut c_void) -> *mut xmlChar {
5363 crate::xml::uri::xmlSaveUri(uri)
5364}
5365
5366#[no_mangle]
5382pub unsafe extern "C" fn xmlParseURIReference(uri: *mut c_void, str: *const c_char) -> c_int {
5383 crate::xml::uri::xmlParseURIReference(uri, str)
5384}
5385
5386#[no_mangle]
5401pub unsafe extern "C" fn xmlNormalizeURIPath(path: *mut c_char) -> c_int {
5402 crate::xml::uri::xmlNormalizeURIPath(path)
5403}
5404
5405#[no_mangle]
5413pub unsafe extern "C" fn xmlURIEscapeStr(
5414 str: *const xmlChar,
5415 list: *const xmlChar,
5416) -> *mut xmlChar {
5417 crate::xml::uri::xmlURIEscapeStr(str, list)
5418}
5419
5420#[no_mangle]
5428pub unsafe extern "C" fn xmlURIUnescapeString(
5429 str: *const c_char,
5430 len: c_int,
5431 target: *mut c_char,
5432) -> *mut c_char {
5433 crate::xml::uri::xmlURIUnescapeString(str, len, target)
5434}
5435
5436unsafe fn xpath_to_object(val: XPathValue) -> *mut _xmlXPathObject {
5451 let obj = xmlMallocZero(size_of::<_xmlXPathObject>()) as *mut _xmlXPathObject;
5452 if obj.is_null() {
5453 return ptr::null_mut();
5454 }
5455 match val {
5456 XPathValue::NodeSet(ns) => {
5457 (*obj).type_ = xmlXPathObjectType::XPATH_NODESET as c_int;
5458 (*obj).nodesetval = ns.to_raw() as *mut c_void;
5459 }
5460 XPathValue::Boolean(b) => {
5461 (*obj).type_ = xmlXPathObjectType::XPATH_BOOLEAN as c_int;
5462 (*obj).boolval = if b { 1 } else { 0 };
5463 }
5464 XPathValue::Number(n) => {
5465 (*obj).type_ = xmlXPathObjectType::XPATH_NUMBER as c_int;
5466 (*obj).floatval = n;
5467 }
5468 XPathValue::String(s) => {
5469 (*obj).type_ = xmlXPathObjectType::XPATH_STRING as c_int;
5470 let bytes = s.as_bytes();
5471 let len = bytes.len();
5472 let buf = xmlMallocImpl(len + 1) as *mut xmlChar;
5473 if !buf.is_null() {
5474 ptr::copy_nonoverlapping(bytes.as_ptr(), buf, len);
5475 *buf.add(len) = 0; }
5477 (*obj).stringval = buf;
5478 }
5479 }
5480 obj
5481}
5482
5483unsafe fn object_to_xpathvalue(obj: *mut _xmlXPathObject) -> XPathValue {
5490 let typ = (*obj).type_;
5491 if typ == xmlXPathObjectType::XPATH_NODESET as c_int {
5492 let ns_ptr = (*obj).nodesetval as *mut _xmlNodeSet;
5493 if ns_ptr.is_null() {
5494 return XPathValue::NodeSet(NodeSet::new());
5495 }
5496 let node_nr = (*ns_ptr).nodeNr;
5497 let node_tab = (*ns_ptr).nodeTab;
5498 let mut ns = NodeSet::new();
5499 if !node_tab.is_null() {
5500 for i in 0..node_nr as isize {
5501 let node = *node_tab.add(i as usize);
5502 ns.push(node);
5503 }
5504 }
5505 XPathValue::NodeSet(ns)
5506 } else if typ == xmlXPathObjectType::XPATH_BOOLEAN as c_int {
5507 XPathValue::Boolean((*obj).boolval != 0)
5508 } else if typ == xmlXPathObjectType::XPATH_NUMBER as c_int {
5509 XPathValue::Number((*obj).floatval)
5510 } else if typ == xmlXPathObjectType::XPATH_STRING as c_int {
5511 let s_ptr = (*obj).stringval;
5512 if s_ptr.is_null() {
5513 XPathValue::String(String::new())
5514 } else {
5515 let s = CStr::from_ptr(s_ptr as *const c_char)
5516 .to_string_lossy()
5517 .into_owned();
5518 XPathValue::String(s)
5519 }
5520 } else if typ == xmlXPathObjectType::XPATH_XSLT_TREE as c_int {
5521 let frag_doc = (*obj).nodesetval as *mut _xmlDoc;
5526 if frag_doc.is_null() {
5527 XPathValue::NodeSet(NodeSet::new())
5528 } else {
5529 let mut ns = NodeSet::new();
5530 ns.push(frag_doc as *mut _xmlNode);
5531 XPathValue::NodeSet(ns)
5532 }
5533 } else {
5534 XPathValue::Boolean(false)
5536 }
5537}
5538
5539pub unsafe fn xpath_to_object_pub(val: XPathValue) -> *mut _xmlXPathObject {
5545 xpath_to_object(val)
5546}
5547
5548pub unsafe fn object_to_xpathvalue_pub(obj: *mut _xmlXPathObject) -> XPathValue {
5555 object_to_xpathvalue(obj)
5556}
5557
5558static COMPILED_EXPRS: Lazy<Mutex<HashMap<u64, Box<CompiledExpr>>>> =
5564 Lazy::new(|| Mutex::new(HashMap::new()));
5565static NEXT_COMPILED_KEY: Lazy<Mutex<u64>> = Lazy::new(|| Mutex::new(1));
5566
5567pub(crate) fn xpath_compiled_registry() -> &'static Mutex<HashMap<u64, Box<CompiledExpr>>> {
5570 &COMPILED_EXPRS
5571}
5572
5573type CXPathFunc = unsafe extern "C" fn(*mut c_void, c_int);
5583
5584#[derive(Clone, Copy, PartialEq, Eq, Hash)]
5587struct SendSyncPtr(*mut c_void);
5588unsafe impl Send for SendSyncPtr {}
5589unsafe impl Sync for SendSyncPtr {}
5590
5591static C_FUNCTIONS: Lazy<Mutex<HashMap<(SendSyncPtr, String), CXPathFunc>>> =
5592 Lazy::new(|| Mutex::new(HashMap::new()));
5593
5594pub(crate) fn xpath_cfunc_lookup(extra: *mut c_void, qualified: &str) -> Option<CXPathFunc> {
5598 C_FUNCTIONS
5599 .lock()
5600 .get(&(SendSyncPtr(extra), qualified.to_string()))
5601 .copied()
5602}
5603
5604pub(crate) fn xpath_cfunc_cleanup(extra: *mut c_void) {
5607 C_FUNCTIONS.lock().retain(|(k, _), _| k.0 != extra);
5608}
5609
5610fn c_func_bridge_closure(c_ctxt: SendSyncPtr, qualified: String) -> BoxedXPathFunction {
5615 Box::new(move |_ctx: &mut XPathContext, args: &[XPathValue]| {
5616 let cc = c_ctxt;
5617 unsafe { c_func_call_bridge(cc.0 as *mut _xmlXPathContext, &qualified, args) }
5618 })
5619}
5620
5621pub(crate) unsafe fn call_c_xpath_function(
5631 fnptr: Option<unsafe extern "C" fn(*mut c_void, c_int)>,
5632 c_ctxt: *mut _xmlXPathContext,
5633 args: &[XPathValue],
5634) -> Result<XPathValue, String> {
5635 let func = match fnptr {
5636 Some(f) => f,
5637 None => return Err("XPath: missing C function pointer".to_string()),
5638 };
5639 let pc = crate::xml::xpath::parser_context::new_parser_context(ptr::null(), c_ctxt);
5640 if pc.is_null() {
5641 return Err("XPath: parser-context allocation failure".to_string());
5642 }
5643 let mut push_ok = true;
5644 for v in args {
5645 let obj = xpath_to_object(v.clone());
5646 if obj.is_null() || crate::xml::xpath::parser_context::value_push(pc, obj).is_null() {
5647 push_ok = false;
5648 break;
5649 }
5650 }
5651 let result = if push_ok {
5652 unsafe { func(pc as *mut c_void, args.len() as c_int) };
5655 let ret = crate::xml::xpath::parser_context::value_pop(pc);
5656 if ret.is_null() {
5657 Err("XPath: C function returned no value".to_string())
5658 } else {
5659 let v = object_to_xpathvalue(ret);
5660 unsafe { xmlXPathFreeObject(ret) };
5662 Ok(v)
5663 }
5664 } else {
5665 Err("XPath: failed to push arguments to C function".to_string())
5666 };
5667 unsafe {
5669 loop {
5670 let leftover = crate::xml::xpath::parser_context::value_pop(pc);
5671 if leftover.is_null() {
5672 break;
5673 }
5674 xmlXPathFreeObject(leftover);
5675 }
5676 crate::xml::xpath::parser_context::free_parser_context(pc);
5677 }
5678 result
5679}
5680
5681unsafe fn c_func_call_bridge(
5688 c_ctxt: *mut _xmlXPathContext,
5689 qualified: &str,
5690 args: &[XPathValue],
5691) -> Result<XPathValue, String> {
5692 if c_ctxt.is_null() {
5693 return Err("XPath: null context in C function bridge".to_string());
5694 }
5695 let func = xpath_cfunc_lookup((*c_ctxt).extra, qualified);
5696 if func.is_none() {
5697 return Err(format!("XPath: unknown C function '{}'", qualified));
5698 }
5699 unsafe { call_c_xpath_function(func, c_ctxt, args) }
5700}
5701
5702#[no_mangle]
5715pub unsafe extern "C" fn xmlXPathNewContext(doc: *mut _xmlDoc) -> *mut _xmlXPathContext {
5716 let ctxt = xmlMallocZero(size_of::<_xmlXPathContext>()) as *mut _xmlXPathContext;
5717 if ctxt.is_null() {
5718 return ptr::null_mut();
5719 }
5720
5721 (*ctxt).doc = doc;
5723 (*ctxt).node = ptr::null_mut();
5724 (*ctxt).contextSize = 1;
5725 (*ctxt).proximityPosition = 1;
5726
5727 let mut internal = Box::new(XPathContext::new(doc));
5729 for (name, func) in crate::xml::xpath::functions::core_functions() {
5734 internal.register_function(&name, func);
5735 }
5736 (*ctxt).extra = Box::into_raw(internal) as *mut c_void;
5737
5738 ctxt
5739}
5740
5741#[no_mangle]
5749pub unsafe extern "C" fn xmlXPathFreeContext(ctxt: *mut _xmlXPathContext) {
5750 if ctxt.is_null() {
5751 return;
5752 }
5753 if !(*ctxt).extra.is_null() {
5755 let _ = Box::from_raw((*ctxt).extra as *mut XPathContext);
5756 (*ctxt).extra = ptr::null_mut();
5757 }
5758 if !(*ctxt).nsHash.is_null() {
5760 drop(Box::from_raw(
5761 (*ctxt).nsHash as *mut HashMap<String, CString>,
5762 ));
5763 (*ctxt).nsHash = ptr::null_mut();
5764 }
5765 xmlFreeImpl(ctxt as *mut c_void);
5767}
5768
5769#[no_mangle]
5778pub unsafe extern "C" fn xmlXPathEvalExpression(
5779 str_: *const xmlChar,
5780 ctxt: *mut _xmlXPathContext,
5781) -> *mut _xmlXPathObject {
5782 if str_.is_null() || ctxt.is_null() {
5783 return ptr::null_mut();
5784 }
5785 let expr_str = match CStr::from_ptr(str_ as *const c_char).to_str() {
5786 Ok(s) => s,
5787 Err(_) => return ptr::null_mut(),
5788 };
5789 let internal = (*ctxt).extra as *mut XPathContext;
5790 if internal.is_null() {
5791 return ptr::null_mut();
5792 }
5793 let internal = &mut *internal;
5794 internal.clear_error();
5797
5798 match crate::xml::xpath::evaluate_str(expr_str, internal) {
5799 Some(val) => xpath_to_object(val),
5800 None => {
5801 if internal.error.is_none() {
5806 internal.set_error("Invalid expression");
5807 }
5808 ptr::null_mut()
5809 }
5810 }
5811}
5812
5813#[no_mangle]
5821pub unsafe extern "C" fn xmlXPathEval(
5822 str_: *const xmlChar,
5823 ctxt: *mut _xmlXPathContext,
5824) -> *mut _xmlXPathObject {
5825 xmlXPathEvalExpression(str_, ctxt)
5826}
5827
5828#[no_mangle]
5839pub unsafe extern "C" fn xmlXPathFreeObject(obj: *mut _xmlXPathObject) {
5840 if obj.is_null() {
5841 return;
5842 }
5843 let typ = (*obj).type_;
5844 if typ == xmlXPathObjectType::XPATH_STRING as c_int {
5846 if !(*obj).stringval.is_null() {
5847 xmlFreeImpl((*obj).stringval as *mut c_void);
5848 (*obj).stringval = ptr::null_mut();
5849 }
5850 }
5851 if typ == xmlXPathObjectType::XPATH_NODESET as c_int {
5853 let ns = (*obj).nodesetval as *mut _xmlNodeSet;
5854 if !ns.is_null() {
5855 if !(*ns).nodeTab.is_null() {
5856 xmlFreeImpl((*ns).nodeTab as *mut c_void);
5857 }
5858 xmlFreeImpl(ns as *mut c_void);
5859 }
5860 (*obj).nodesetval = ptr::null_mut();
5861 }
5862 xmlFreeImpl(obj as *mut c_void);
5863}
5864
5865#[no_mangle]
5877pub unsafe extern "C" fn xmlXPathObjectCopy(val: *mut _xmlXPathObject) -> *mut _xmlXPathObject {
5878 if val.is_null() {
5879 return ptr::null_mut();
5880 }
5881 let typ = (*val).type_;
5882 let obj = xmlMallocZero(size_of::<_xmlXPathObject>()) as *mut _xmlXPathObject;
5883 if obj.is_null() {
5884 return ptr::null_mut();
5885 }
5886 (*obj).type_ = typ;
5887 if typ == xmlXPathObjectType::XPATH_NODESET as c_int {
5888 let src_ns = (*val).nodesetval as *mut _xmlNodeSet;
5889 if !src_ns.is_null() {
5890 let nr = (*src_ns).nodeNr;
5891 let ns = xmlMallocZero(size_of::<_xmlNodeSet>()) as *mut _xmlNodeSet;
5892 if ns.is_null() {
5893 xmlFreeImpl(obj as *mut c_void);
5894 return ptr::null_mut();
5895 }
5896 (*ns).nodeNr = nr;
5897 (*ns).nodeMax = nr;
5898 if nr > 0 && !(*src_ns).nodeTab.is_null() {
5899 let tab = xmlMallocImpl((nr as usize) * core::mem::size_of::<*mut _xmlNode>())
5900 as *mut *mut _xmlNode;
5901 if tab.is_null() {
5902 xmlFreeImpl(ns as *mut c_void);
5903 xmlFreeImpl(obj as *mut c_void);
5904 return ptr::null_mut();
5905 }
5906 ptr::copy_nonoverlapping((*src_ns).nodeTab, tab, nr as usize);
5907 (*ns).nodeTab = tab;
5908 } else {
5909 (*ns).nodeTab = ptr::null_mut();
5910 }
5911 (*obj).nodesetval = ns as *mut c_void;
5912 }
5913 } else if typ == xmlXPathObjectType::XPATH_BOOLEAN as c_int {
5914 (*obj).boolval = (*val).boolval;
5915 } else if typ == xmlXPathObjectType::XPATH_NUMBER as c_int {
5916 (*obj).floatval = (*val).floatval;
5917 } else if typ == xmlXPathObjectType::XPATH_STRING as c_int {
5918 let src = (*val).stringval;
5919 if !src.is_null() {
5920 let len = libc::strlen(src as *const libc::c_char);
5921 let buf = xmlMallocImpl(len + 1) as *mut xmlChar;
5922 if !buf.is_null() {
5923 ptr::copy_nonoverlapping(src, buf, len);
5924 *buf.add(len) = 0;
5925 }
5926 (*obj).stringval = buf;
5927 }
5928 }
5929 obj
5930}
5931
5932#[no_mangle]
5942pub unsafe extern "C" fn xmlXPathCastToString(val: *mut _xmlXPathObject) -> *mut xmlChar {
5943 if val.is_null() {
5944 return ptr::null_mut();
5945 }
5946 let typ = (*val).type_;
5947 let mut result: Vec<u8> = Vec::new();
5948 if typ == xmlXPathObjectType::XPATH_STRING as c_int {
5949 if !(*val).stringval.is_null() {
5950 let len = libc::strlen((*val).stringval as *const libc::c_char);
5951 result.extend_from_slice(core::slice::from_raw_parts((*val).stringval, len));
5952 }
5953 } else if typ == xmlXPathObjectType::XPATH_NUMBER as c_int {
5954 let n = (*val).floatval;
5960 result.extend_from_slice(xml_number_to_string(n).as_bytes());
5961 } else if typ == xmlXPathObjectType::XPATH_BOOLEAN as c_int {
5962 result.extend_from_slice(if (*val).boolval != 0 {
5963 b"true"
5964 } else {
5965 b"false"
5966 });
5967 } else if typ == xmlXPathObjectType::XPATH_NODESET as c_int {
5968 let ns = (*val).nodesetval as *mut _xmlNodeSet;
5971 if !ns.is_null() && (*ns).nodeNr > 0 && !(*ns).nodeTab.is_null() {
5972 let node = *(*ns).nodeTab;
5973 if !node.is_null() {
5974 let content = crate::xml::tree::node_get_content(node);
5975 if !content.is_null() {
5976 let len = libc::strlen(content as *const libc::c_char);
5977 result.extend_from_slice(core::slice::from_raw_parts(content, len));
5978 xmlFreeImpl(content as *mut c_void);
5979 }
5980 }
5981 }
5982 }
5983 let buf = xmlMallocImpl(result.len() + 1) as *mut xmlChar;
5985 if buf.is_null() {
5986 return ptr::null_mut();
5987 }
5988 if !result.is_empty() {
5989 ptr::copy_nonoverlapping(result.as_ptr(), buf, result.len());
5990 }
5991 *buf.add(result.len()) = 0;
5992 buf
5993}
5994
5995pub fn xml_number_to_string(n: f64) -> String {
6002 crate::xml::xpath::types::number_to_string(n)
6003}
6004
6005fn xpath_string_eval_number(bytes: &[u8]) -> f64 {
6013 crate::xml::xpath::types::string_bytes_to_number(bytes)
6014}
6015
6016#[no_mangle]
6024pub unsafe extern "C" fn xmlXPathCastStringToNumber(val: *const xmlChar) -> f64 {
6025 if val.is_null() {
6026 return f64::NAN;
6027 }
6028 let len = libc::strlen(val as *const libc::c_char);
6029 let bytes = core::slice::from_raw_parts(val, len);
6030 xpath_string_eval_number(bytes)
6031}
6032
6033#[no_mangle]
6047pub unsafe extern "C" fn xmlXPathCmpNodes(node1: *mut _xmlNode, node2: *mut _xmlNode) -> c_int {
6048 if node1.is_null() || node2.is_null() {
6049 return -2;
6050 }
6051 if node1 == node2 {
6052 return 0;
6053 }
6054 let mut chain1: Vec<*mut _xmlNode> = Vec::new();
6056 let mut chain2: Vec<*mut _xmlNode> = Vec::new();
6057 let mut n = node1;
6058 while !n.is_null() {
6059 chain1.push(n);
6060 n = (*n).parent as *mut _xmlNode;
6061 }
6062 let mut n = node2;
6063 while !n.is_null() {
6064 chain2.push(n);
6065 n = (*n).parent as *mut _xmlNode;
6066 }
6067 if chain1[chain1.len() - 1] != chain2[chain2.len() - 1] {
6069 return -2;
6070 }
6071 let mut i = chain1.len();
6073 let mut j = chain2.len();
6074 while i > 0 && j > 0 && chain1[i - 1] == chain2[j - 1] {
6075 i -= 1;
6076 j -= 1;
6077 }
6078 if i == 0 {
6080 return 1;
6081 }
6082 if j == 0 {
6084 return -1;
6085 }
6086 let mut a = chain1[i - 1];
6088 let mut b = chain2[j - 1];
6089 while !a.is_null() && !b.is_null() {
6091 let pa = (*a).parent as *mut _xmlNode;
6092 let pb = (*b).parent as *mut _xmlNode;
6093 if pa == pb {
6094 break;
6095 }
6096 a = pa;
6097 b = pb;
6098 }
6099 let parent = (*a).parent as *mut _xmlNode;
6101 let mut child = if parent.is_null() {
6102 ptr::null_mut()
6103 } else {
6104 (*parent).children
6105 };
6106 while !child.is_null() {
6107 if child == a {
6108 return 1; }
6110 if child == b {
6111 return -1; }
6113 child = (*child).next;
6114 }
6115 0
6116}
6117
6118#[no_mangle]
6128pub unsafe extern "C" fn xmlXPathNodeSetCreate(val: *mut _xmlNode) -> *mut _xmlNodeSet {
6129 let ns = xmlMallocZero(size_of::<_xmlNodeSet>()) as *mut _xmlNodeSet;
6130 if ns.is_null() {
6131 return ptr::null_mut();
6132 }
6133 if val.is_null() {
6134 return ns;
6135 }
6136 let tab = xmlMallocImpl(core::mem::size_of::<*mut _xmlNode>()) as *mut *mut _xmlNode;
6137 if tab.is_null() {
6138 xmlFreeImpl(ns as *mut c_void);
6139 return ptr::null_mut();
6140 }
6141 *tab = val;
6142 (*ns).nodeTab = tab;
6143 (*ns).nodeNr = 1;
6144 (*ns).nodeMax = 1;
6145 ns
6146}
6147
6148#[no_mangle]
6160pub unsafe extern "C" fn xmlXPathFreeNodeSet(ns: *mut _xmlNodeSet) {
6161 if ns.is_null() {
6162 return;
6163 }
6164 if !(*ns).nodeTab.is_null() {
6165 xmlFreeImpl((*ns).nodeTab as *mut c_void);
6166 (*ns).nodeTab = ptr::null_mut();
6167 }
6168 (*ns).nodeNr = 0;
6169 (*ns).nodeMax = 0;
6170 xmlFreeImpl(ns as *mut c_void);
6171}
6172
6173#[no_mangle]
6184pub unsafe extern "C" fn xmlXPathCompile(str_: *const xmlChar) -> *mut c_void {
6185 if str_.is_null() {
6186 return ptr::null_mut();
6187 }
6188 let expr_str = match CStr::from_ptr(str_ as *const c_char).to_str() {
6189 Ok(s) => s,
6190 Err(_) => return ptr::null_mut(),
6191 };
6192
6193 match crate::xml::xpath::compile(expr_str) {
6194 Some(compiled) => {
6195 let mut map = COMPILED_EXPRS.lock();
6196 let mut counter = NEXT_COMPILED_KEY.lock();
6197 let key = *counter;
6198 *counter += 1;
6199 map.insert(key, Box::new(compiled));
6200 key as *mut c_void
6201 }
6202 None => ptr::null_mut(),
6203 }
6204}
6205
6206#[no_mangle]
6214pub unsafe extern "C" fn xmlXPathFreeCompExpr(comp: *mut c_void) {
6215 if comp.is_null() {
6216 return;
6217 }
6218 let mut map = COMPILED_EXPRS.lock();
6219 map.remove(&(comp as u64));
6220}
6221
6222#[no_mangle]
6231pub unsafe extern "C" fn xmlXPathRegisterNs(
6232 ctxt: *mut _xmlXPathContext,
6233 prefix: *const xmlChar,
6234 ns_uri: *const xmlChar,
6235) -> c_int {
6236 if ctxt.is_null() || prefix.is_null() || ns_uri.is_null() {
6237 return -1;
6238 }
6239 let internal = (*ctxt).extra as *mut XPathContext;
6240 if internal.is_null() {
6241 return -1;
6242 }
6243 let internal = &mut *internal;
6244
6245 let prefix_str = match CStr::from_ptr(prefix as *const c_char).to_str() {
6246 Ok(s) => s,
6247 Err(_) => return -1,
6248 };
6249 let uri_str = match CStr::from_ptr(ns_uri as *const c_char).to_str() {
6250 Ok(s) => s,
6251 Err(_) => return -1,
6252 };
6253
6254 internal.register_namespace(prefix_str, uri_str);
6255
6256 let map: &mut HashMap<String, CString> = if (*ctxt).nsHash.is_null() {
6261 let b: Box<HashMap<String, CString>> = Box::new(HashMap::new());
6262 (*ctxt).nsHash = Box::into_raw(b) as *mut c_void;
6263 &mut *((*ctxt).nsHash as *mut HashMap<String, CString>)
6264 } else {
6265 &mut *((*ctxt).nsHash as *mut HashMap<String, CString>)
6266 };
6267 map.insert(
6268 prefix_str.to_string(),
6269 CString::new(uri_str.as_bytes()).unwrap_or_default(),
6270 );
6271 0
6272}
6273
6274#[no_mangle]
6288pub unsafe extern "C" fn xmlXPathRegisterFunc(
6289 ctxt: *mut _xmlXPathContext,
6290 name: *const xmlChar,
6291 f: Option<unsafe extern "C" fn(*mut c_void, c_int)>,
6292) -> c_int {
6293 if ctxt.is_null() || name.is_null() {
6294 return -1;
6295 }
6296 let internal = (*ctxt).extra as *mut XPathContext;
6297 if internal.is_null() {
6298 return -1;
6299 }
6300 let internal = &mut *internal;
6301
6302 let name_str = match CStr::from_ptr(name as *const c_char).to_str() {
6303 Ok(s) => s,
6304 Err(_) => return -1,
6305 };
6306
6307 if let Some(func) = f {
6308 let key = (SendSyncPtr((*ctxt).extra), name_str.to_string());
6310 C_FUNCTIONS.lock().insert(key, func);
6311 let c_ctxt = SendSyncPtr(ctxt as *mut c_void);
6314 let name_owned = name_str.to_string();
6315 internal.register_function(name_str, c_func_bridge_closure(c_ctxt, name_owned));
6316 }
6317 0
6318}
6319
6320#[no_mangle]
6330pub unsafe extern "C" fn xmlXPathRegisterFuncNS(
6331 ctxt: *mut _xmlXPathContext,
6332 name: *const xmlChar,
6333 ns_uri: *const xmlChar,
6334 f: Option<unsafe extern "C" fn(*mut c_void, c_int)>,
6335) -> c_int {
6336 if ctxt.is_null() || name.is_null() {
6337 return -1;
6338 }
6339 let internal = (*ctxt).extra as *mut XPathContext;
6340 if internal.is_null() {
6341 return -1;
6342 }
6343 let internal = &mut *internal;
6344
6345 let name_str = match CStr::from_ptr(name as *const c_char).to_str() {
6346 Ok(s) => s,
6347 Err(_) => return -1,
6348 };
6349 let ns_str = if ns_uri.is_null() {
6350 String::new()
6351 } else {
6352 match CStr::from_ptr(ns_uri as *const c_char).to_str() {
6353 Ok(s) => s.to_string(),
6354 Err(_) => return -1,
6355 }
6356 };
6357
6358 let qualified = if ns_str.is_empty() {
6360 name_str.to_string()
6361 } else {
6362 format!("{{{}}}{}", ns_str, name_str)
6363 };
6364
6365 if let Some(func) = f {
6366 let key = (SendSyncPtr((*ctxt).extra), qualified.clone());
6367 C_FUNCTIONS.lock().insert(key, func);
6368 let c_ctxt = SendSyncPtr(ctxt as *mut c_void);
6369 let qualified_owned = qualified.clone();
6370 internal.register_function(&qualified, c_func_bridge_closure(c_ctxt, qualified_owned));
6371 }
6372 0
6373}
6374
6375#[no_mangle]
6384pub unsafe extern "C" fn xmlXPathRegisterVariable(
6385 ctxt: *mut _xmlXPathContext,
6386 name: *const xmlChar,
6387 value: *mut _xmlXPathObject,
6388) -> c_int {
6389 if ctxt.is_null() || name.is_null() || value.is_null() {
6390 return -1;
6391 }
6392 let internal = (*ctxt).extra as *mut XPathContext;
6393 if internal.is_null() {
6394 return -1;
6395 }
6396 let internal = &mut *internal;
6397
6398 let name_str = match CStr::from_ptr(name as *const c_char).to_str() {
6399 Ok(s) => s,
6400 Err(_) => return -1,
6401 };
6402
6403 let xpath_val = object_to_xpathvalue(value);
6404 internal.register_variable(name_str, xpath_val);
6405 0
6406}
6407
6408#[no_mangle]
6416pub unsafe extern "C" fn xmlXPathNewNodeSet(val: *mut _xmlNode) -> *mut _xmlXPathObject {
6417 let ns = if val.is_null() {
6418 NodeSet::new()
6419 } else {
6420 NodeSet::singleton(val)
6421 };
6422 xpath_to_object(XPathValue::NodeSet(ns))
6423}
6424
6425#[no_mangle]
6433pub unsafe extern "C" fn xmlXPathNewCString(val: *const xmlChar) -> *mut _xmlXPathObject {
6434 if val.is_null() {
6435 return xpath_to_object(XPathValue::String(String::new()));
6436 }
6437 let s = match CStr::from_ptr(val as *const c_char).to_str() {
6438 Ok(s) => s.to_string(),
6439 Err(_) => return ptr::null_mut(),
6440 };
6441 xpath_to_object(XPathValue::String(s))
6442}
6443
6444#[no_mangle]
6452pub extern "C" fn xmlXPathNewFloat(val: f64) -> *mut _xmlXPathObject {
6453 unsafe { xpath_to_object(XPathValue::Number(val)) }
6454}
6455
6456#[no_mangle]
6464pub extern "C" fn xmlXPathNewBoolean(val: c_int) -> *mut _xmlXPathObject {
6465 unsafe { xpath_to_object(XPathValue::Boolean(val != 0)) }
6466}
6467
6468#[no_mangle]
6482pub unsafe extern "C" fn xmlXPtrEval(expr: *const c_char, doc: *mut _xmlDoc) -> *mut _xmlNode {
6483 crate::xml::xpointer::xmlXPtrEval(expr, doc)
6484}
6485
6486#[no_mangle]
6498pub unsafe extern "C" fn xmlXIncludeProcess(doc: *mut _xmlDoc) -> c_int {
6499 crate::xml::xinclude::xinclude_process(doc)
6500}
6501
6502#[no_mangle]
6510pub unsafe extern "C" fn xmlXIncludeProcessFlags(doc: *mut _xmlDoc, flags: c_int) -> c_int {
6511 crate::xml::xinclude::xinclude_process_flags(doc, flags)
6512}
6513
6514#[no_mangle]
6526pub extern "C" fn xmlCatalogLoad(catalogs: *const c_char) -> *mut c_void {
6527 if catalogs.is_null() {
6528 return ptr::null_mut();
6529 }
6530 crate::xml::catalog::load_catalog(catalogs)
6531}
6532
6533#[no_mangle]
6541pub unsafe extern "C" fn xmlCatalogResolvePublic(pubID: *const xmlChar) -> *mut xmlChar {
6542 if pubID.is_null() {
6543 return ptr::null_mut();
6544 }
6545 crate::xml::catalog::resolve_public(pubID)
6546}
6547
6548#[no_mangle]
6556pub unsafe extern "C" fn xmlCatalogResolveSystem(sysID: *const xmlChar) -> *mut xmlChar {
6557 if sysID.is_null() {
6558 return ptr::null_mut();
6559 }
6560 crate::xml::catalog::resolve_system(sysID)
6561}
6562
6563#[no_mangle]
6571pub unsafe extern "C" fn xmlCatalogResolveURI(URI: *const xmlChar) -> *mut xmlChar {
6572 if URI.is_null() {
6573 return ptr::null_mut();
6574 }
6575 crate::xml::catalog::resolve_uri(URI)
6576}
6577
6578#[no_mangle]
6586pub extern "C" fn xmlCatalogSetDefaults(allow: c_int) {
6587 crate::xml::catalog::set_defaults(allow)
6588}
6589
6590#[no_mangle]
6598pub extern "C" fn xmlCatalogGetDefaults() -> c_int {
6599 crate::xml::catalog::get_defaults()
6600}
6601
6602#[no_mangle]
6610pub unsafe extern "C" fn xmlCatalogAdd(
6611 type_: *const xmlChar,
6612 orig: *const xmlChar,
6613 replace: *const xmlChar,
6614) -> c_int {
6615 if type_.is_null() || orig.is_null() || replace.is_null() {
6616 return -1;
6617 }
6618 crate::xml::catalog::add(type_, orig, replace)
6619}
6620
6621#[no_mangle]
6629pub unsafe extern "C" fn xmlCatalogRemove(value: *const xmlChar) -> c_int {
6630 if value.is_null() {
6631 return 0;
6632 }
6633 crate::xml::catalog::remove(value)
6634}
6635
6636#[no_mangle]
6644pub unsafe extern "C" fn xmlCatalogDump(output: *mut c_void, _catal: *mut c_void) {
6645 if output.is_null() {
6646 return;
6647 }
6648 let doc = crate::xml::catalog::dump_doc();
6649 if doc.is_null() {
6650 return;
6651 }
6652 let mut mem: *mut xmlChar = ptr::null_mut();
6653 let mut size: c_int = 0;
6654 crate::xml::tree::xmlDocDumpFormatMemory(doc, &mut mem, &mut size, 1);
6655 if !mem.is_null() {
6656 libc::fwrite(
6657 mem as *const c_void,
6658 1,
6659 size as usize,
6660 output as *mut libc::FILE,
6661 );
6662 xmlFreeImpl(mem as *mut c_void);
6663 }
6664 crate::xml::tree::free_doc(doc);
6665}
6666
6667#[no_mangle]
6677pub unsafe extern "C" fn xmlCatalogSave(filename: *const c_char) -> c_int {
6678 if filename.is_null() {
6679 return -1;
6680 }
6681 let doc = crate::xml::catalog::dump_doc();
6682 if doc.is_null() {
6683 return -1;
6684 }
6685 let mut mem: *mut xmlChar = ptr::null_mut();
6686 let mut size: c_int = 0;
6687 crate::xml::tree::xmlDocDumpFormatMemory(doc, &mut mem, &mut size, 1);
6688 let mut ret: c_int = -1;
6689 if !mem.is_null() {
6690 let fp = libc::fopen(filename, b"w\0".as_ptr() as *const c_char);
6691 if !fp.is_null() {
6692 let written = libc::fwrite(mem as *const c_void, 1, size as usize, fp);
6693 ret = if written == size as usize { 0 } else { -1 };
6694 libc::fclose(fp);
6695 }
6696 xmlFreeImpl(mem as *mut c_void);
6697 }
6698 crate::xml::tree::free_doc(doc);
6699 ret
6700}
6701
6702#[no_mangle]
6710pub extern "C" fn xmlCatalogCleanup() {
6711 crate::xml::catalog::cleanup();
6712}
6713
6714#[no_mangle]
6722pub extern "C" fn xmlCatalogConvert() -> *mut _xmlDoc {
6723 unsafe { crate::xml::catalog::convert() }
6725}
6726
6727#[no_mangle]
6739pub unsafe extern "C" fn htmlParseFile(
6740 _filename: *const c_char,
6741 _encoding: *const c_char,
6742) -> *mut _xmlDoc {
6743 ptr::null_mut()
6745}
6746
6747#[no_mangle]
6755pub unsafe extern "C" fn htmlParseMemory(_buffer: *const c_char, _size: c_int) -> *mut _xmlDoc {
6756 ptr::null_mut()
6758}
6759
6760#[no_mangle]
6768pub unsafe extern "C" fn htmlParseDoc(
6769 _cur: *const xmlChar,
6770 _encoding: *const c_char,
6771) -> *mut _xmlDoc {
6772 ptr::null_mut()
6774}
6775
6776#[no_mangle]
6785pub unsafe extern "C" fn htmlCreateFileParserCtxt(
6786 _filename: *const c_char,
6787 _encoding: *const c_char,
6788) -> *mut c_void {
6789 ptr::null_mut()
6791}
6792
6793#[no_mangle]
6801pub extern "C" fn htmlFreeParserCtxt(ctxt: *mut c_void) {
6802 unsafe { crate::xml::html::free_parser_ctxt(ctxt) }
6803}
6804
6805#[no_mangle]
6813pub extern "C" fn htmlInitParser() {
6814 }
6816
6817#[no_mangle]
6825pub extern "C" fn htmlCleanupParser() {
6826 }
6828
6829#[no_mangle]
6841pub unsafe extern "C" fn xmlNewValidCtxt() -> *mut _xmlValidCtxt {
6842 crate::xml::validation::new_valid_ctxt()
6843}
6844
6845#[no_mangle]
6853pub unsafe extern "C" fn xmlFreeValidCtxt(ctxt: *mut _xmlValidCtxt) {
6854 crate::xml::validation::free_valid_ctxt(ctxt);
6855}
6856
6857#[no_mangle]
6868pub unsafe extern "C" fn xmlSetValidErrors(
6869 ctxt: *mut _xmlValidCtxt,
6870 err: Option<xmlGenericErrorFunc>,
6871 warn: Option<xmlGenericErrorFunc>,
6872 data: *mut c_void,
6873) {
6874 crate::xml::validation::set_valid_errors(ctxt, err, warn, data);
6875}
6876
6877#[no_mangle]
6885pub unsafe extern "C" fn xmlValidateDocument(ctxt: *mut _xmlValidCtxt, doc: *mut _xmlDoc) -> c_int {
6886 crate::xml::validation::validate_document(ctxt, doc)
6887}
6888
6889#[no_mangle]
6897pub unsafe extern "C" fn xmlValidateDocumentFinal(
6898 ctxt: *mut _xmlValidCtxt,
6899 doc: *mut _xmlDoc,
6900) -> c_int {
6901 crate::xml::validation::validate_document_final(ctxt, doc)
6902}
6903
6904#[no_mangle]
6914pub unsafe extern "C" fn xmlValidateElement(
6915 ctxt: *mut _xmlValidCtxt,
6916 doc: *mut _xmlDoc,
6917 elem: *mut _xmlNode,
6918) -> c_int {
6919 crate::xml::validation::validate_element(ctxt, doc, elem)
6920}
6921
6922#[no_mangle]
6933pub unsafe extern "C" fn xmlValidateAttributeDecl(
6934 ctxt: *mut _xmlValidCtxt,
6935 doc: *mut _xmlDoc,
6936 elem: *mut _xmlNode,
6937 attr: *mut _xmlAttribute,
6938) -> c_int {
6939 crate::xml::validation::validate_attribute_decl(ctxt, doc, elem, attr)
6940}
6941
6942#[no_mangle]
6950pub unsafe extern "C" fn xmlValidateAttributeValue(atype: c_int, value: *const xmlChar) -> c_int {
6951 crate::xml::validation::validate_attribute_value(atype, value)
6952}
6953
6954#[no_mangle]
6964pub unsafe extern "C" fn xmlValidateNotationUse(
6965 ctxt: *mut _xmlValidCtxt,
6966 doc: *mut _xmlDoc,
6967 notation_name: *const xmlChar,
6968) -> c_int {
6969 crate::xml::validation::validate_notation_use(ctxt, doc, notation_name)
6970}
6971
6972#[no_mangle]
6983pub unsafe extern "C" fn xmlValidateID(
6984 ctxt: *mut _xmlValidCtxt,
6985 doc: *mut _xmlDoc,
6986 node: *mut _xmlNode,
6987 value: *const xmlChar,
6988) -> c_int {
6989 crate::xml::validation::validate_id(ctxt, doc, node, value)
6990}
6991
6992#[no_mangle]
7003pub unsafe extern "C" fn xmlValidateIDRef(
7004 ctxt: *mut _xmlValidCtxt,
7005 doc: *mut _xmlDoc,
7006 node: *mut _xmlNode,
7007 value: *const xmlChar,
7008) -> c_int {
7009 crate::xml::validation::validate_id_ref(ctxt, doc, node, value)
7010}
7011
7012#[no_mangle]
7023pub unsafe extern "C" fn xmlValidateIDRefs(
7024 ctxt: *mut _xmlValidCtxt,
7025 doc: *mut _xmlDoc,
7026 node: *mut _xmlNode,
7027 value: *const xmlChar,
7028) -> c_int {
7029 crate::xml::validation::validate_id_refs(ctxt, doc, node, value)
7030}
7031
7032#[no_mangle]
7042pub unsafe extern "C" fn xmlValidateNCName(value: *const xmlChar, space: c_int) -> c_int {
7043 crate::xml::validation::validate_ncname(value, space)
7044}
7045
7046#[no_mangle]
7054pub unsafe extern "C" fn xmlValidateQName(value: *const xmlChar, space: c_int) -> c_int {
7055 crate::xml::validation::validate_qname(value, space)
7056}
7057
7058#[no_mangle]
7071pub unsafe extern "C" fn xmlValidateName(value: *const xmlChar, space: c_int) -> c_int {
7072 crate::xml::validation::validate_name_space(value, space)
7073}
7074
7075#[no_mangle]
7083pub unsafe extern "C" fn xmlValidateNMToken(value: *const xmlChar, space: c_int) -> c_int {
7084 crate::xml::validation::validate_nmtoken_space(value, space)
7085}
7086
7087#[no_mangle]
7097pub unsafe extern "C" fn xmlValidateNameValue(value: *const xmlChar) -> c_int {
7098 crate::xml::validation::validate_name_value(value)
7099}
7100
7101#[no_mangle]
7110pub unsafe extern "C" fn xmlValidateNamesValue(value: *const xmlChar) -> c_int {
7111 crate::xml::validation::validate_names_value(value)
7112}
7113
7114#[no_mangle]
7122pub unsafe extern "C" fn xmlValidateNmtokenValue(value: *const xmlChar) -> c_int {
7123 crate::xml::validation::validate_nmtoken_value(value)
7124}
7125
7126#[no_mangle]
7134pub unsafe extern "C" fn xmlValidateNmtokensValue(value: *const xmlChar) -> c_int {
7135 crate::xml::validation::validate_nmtokens_value(value)
7136}
7137
7138#[no_mangle]
7149pub unsafe extern "C" fn xmlValidateElementDecl(
7150 ctxt: *mut _xmlValidCtxt,
7151 doc: *mut _xmlDoc,
7152 elem: *mut _xmlElement,
7153) -> c_int {
7154 crate::xml::validation::validate_element_decl(ctxt, doc, elem)
7155}
7156
7157#[no_mangle]
7170pub unsafe extern "C" fn xmlValidateNotationDecl(
7171 ctxt: *mut _xmlValidCtxt,
7172 doc: *mut _xmlDoc,
7173 nota: *mut _xmlNotation,
7174) -> c_int {
7175 crate::xml::validation::validate_notation_decl(ctxt, doc, nota)
7176}
7177
7178#[no_mangle]
7190pub unsafe extern "C" fn xmlValidateOneAttribute(
7191 ctxt: *mut _xmlValidCtxt,
7192 doc: *mut _xmlDoc,
7193 elem: *mut _xmlNode,
7194 attr: *mut _xmlAttr,
7195 value: *const xmlChar,
7196) -> c_int {
7197 crate::xml::validation::validate_one_attribute(ctxt, doc, elem, attr, value)
7198}
7199
7200#[no_mangle]
7210pub unsafe extern "C" fn xmlValidateOneElement(
7211 ctxt: *mut _xmlValidCtxt,
7212 doc: *mut _xmlDoc,
7213 elem: *mut _xmlNode,
7214) -> c_int {
7215 crate::xml::validation::validate_one_element(ctxt, doc, elem)
7216}
7217
7218#[no_mangle]
7231pub unsafe extern "C" fn xmlValidateOneNamespace(
7232 ctxt: *mut _xmlValidCtxt,
7233 doc: *mut _xmlDoc,
7234 elem: *mut _xmlNode,
7235 prefix: *const xmlChar,
7236 ns: *mut _xmlNs,
7237 value: *const xmlChar,
7238) -> c_int {
7239 crate::xml::validation::validate_one_namespace(ctxt, doc, elem, prefix, ns, value)
7240}
7241
7242#[no_mangle]
7254pub unsafe extern "C" fn xmlValidatePushElement(
7255 ctxt: *mut _xmlValidCtxt,
7256 doc: *mut _xmlDoc,
7257 elem: *mut _xmlNode,
7258 qname: *const xmlChar,
7259) -> c_int {
7260 crate::xml::validation::validate_push_element(ctxt, doc, elem, qname)
7261}
7262
7263#[no_mangle]
7273pub unsafe extern "C" fn xmlValidatePushCData(
7274 ctxt: *mut _xmlValidCtxt,
7275 data: *const xmlChar,
7276 len: c_int,
7277) -> c_int {
7278 crate::xml::validation::validate_push_cdata(ctxt, data, len)
7279}
7280
7281#[no_mangle]
7292pub unsafe extern "C" fn xmlValidatePopElement(
7293 ctxt: *mut _xmlValidCtxt,
7294 doc: *mut _xmlDoc,
7295 elem: *mut _xmlNode,
7296 qname: *const xmlChar,
7297) -> c_int {
7298 crate::xml::validation::validate_pop_element(ctxt, doc, elem, qname)
7299}
7300
7301#[no_mangle]
7310pub unsafe extern "C" fn xmlValidBuildContentModel(
7311 ctxt: *mut _xmlValidCtxt,
7312 elem: *mut _xmlElement,
7313) -> c_int {
7314 crate::xml::validation::validate_build_content_model(ctxt, elem)
7315}
7316
7317#[no_mangle]
7328pub unsafe extern "C" fn xmlAddID(
7329 ctxt: *mut _xmlValidCtxt,
7330 doc: *mut _xmlDoc,
7331 value: *const xmlChar,
7332 attr: *mut _xmlAttr,
7333) -> *mut _xmlID {
7334 crate::xml::validation::add_id(ctxt, doc, value, attr)
7335}
7336
7337#[no_mangle]
7345pub unsafe extern "C" fn xmlRemoveID(doc: *mut _xmlDoc, attr: *mut _xmlAttr) -> c_int {
7346 crate::xml::validation::remove_id(doc, attr)
7347}
7348
7349#[no_mangle]
7360pub unsafe extern "C" fn xmlAddRef(
7361 ctxt: *mut _xmlValidCtxt,
7362 doc: *mut _xmlDoc,
7363 value: *const xmlChar,
7364 attr: *mut _xmlAttr,
7365) -> *mut _xmlRef {
7366 crate::xml::validation::add_ref(ctxt, doc, value, attr)
7367}
7368
7369#[no_mangle]
7377pub unsafe extern "C" fn xmlRemoveRef(doc: *mut _xmlDoc, attr: *mut _xmlAttr) -> c_int {
7378 crate::xml::validation::remove_ref(doc, attr)
7379}
7380
7381#[no_mangle]
7389pub unsafe extern "C" fn xmlAddIDSafe(attr: *mut _xmlAttr, value: *const xmlChar) -> c_int {
7390 crate::xml::validation::add_id_safe(attr, value)
7391}
7392
7393#[no_mangle]
7401pub unsafe extern "C" fn xmlFreeIDTable(table: *mut c_void) {
7402 crate::xml::validation::free_id_table(table as *mut crate::xml::hash::HashTable);
7403}
7404
7405#[no_mangle]
7413pub unsafe extern "C" fn xmlFreeRefTable(table: *mut c_void) {
7414 crate::xml::validation::free_ref_table(table as *mut crate::xml::hash::HashTable);
7415}
7416
7417#[no_mangle]
7425pub unsafe extern "C" fn xmlGetID(doc: *mut _xmlDoc, id: *const xmlChar) -> *mut _xmlAttr {
7426 crate::xml::validation::get_id(doc, id)
7427}
7428
7429#[no_mangle]
7437pub unsafe extern "C" fn xmlGetRefs(doc: *mut _xmlDoc, id: *const xmlChar) -> *mut c_void {
7438 crate::xml::validation::get_refs(doc, id) as *mut c_void
7439}
7440
7441#[no_mangle]
7449pub unsafe extern "C" fn xmlIsID(
7450 doc: *mut _xmlDoc,
7451 elem: *mut _xmlNode,
7452 attr: *mut _xmlAttr,
7453) -> c_int {
7454 crate::xml::validation::is_id(doc, elem, attr)
7455}
7456
7457#[no_mangle]
7465pub unsafe extern "C" fn xmlIsRef(
7466 doc: *mut _xmlDoc,
7467 elem: *mut _xmlNode,
7468 attr: *mut _xmlAttr,
7469) -> c_int {
7470 crate::xml::validation::is_ref(doc, elem, attr)
7471}
7472
7473#[no_mangle]
7481pub unsafe extern "C" fn xmlGetDtdElementDesc(
7482 dtd: *mut _xmlDtd,
7483 name: *const xmlChar,
7484) -> *mut _xmlElement {
7485 crate::xml::validation::get_dtd_element_desc(dtd, name)
7486}
7487
7488#[no_mangle]
7498pub unsafe extern "C" fn xmlGetDtdAttrDesc(
7499 dtd: *mut _xmlDtd,
7500 elem: *const xmlChar,
7501 name: *const xmlChar,
7502) -> *mut _xmlAttribute {
7503 crate::xml::validation::get_dtd_attr_desc(dtd, elem, name)
7504}
7505
7506#[no_mangle]
7516pub unsafe extern "C" fn xmlGetDtdQElementDesc(
7517 dtd: *mut _xmlDtd,
7518 name: *const xmlChar,
7519 prefix: *const xmlChar,
7520) -> *mut _xmlElement {
7521 crate::xml::validation::get_dtd_qelement_desc(dtd, name, prefix)
7522}
7523
7524#[no_mangle]
7535pub unsafe extern "C" fn xmlGetDtdQAttrDesc(
7536 dtd: *mut _xmlDtd,
7537 elem: *const xmlChar,
7538 name: *const xmlChar,
7539 prefix: *const xmlChar,
7540) -> *mut _xmlAttribute {
7541 crate::xml::validation::get_dtd_qattr_desc(dtd, elem, name, prefix)
7542}
7543
7544#[no_mangle]
7552pub unsafe extern "C" fn xmlGetDtdNotationDesc(
7553 dtd: *mut _xmlDtd,
7554 name: *const xmlChar,
7555) -> *mut _xmlNotation {
7556 crate::xml::validation::get_dtd_notation_desc(dtd, name)
7557}
7558
7559#[no_mangle]
7567pub unsafe extern "C" fn xmlValidateRoot(ctxt: *mut _xmlValidCtxt, doc: *mut _xmlDoc) -> c_int {
7568 crate::xml::validation::validate_root(ctxt, doc)
7569}
7570
7571#[no_mangle]
7581pub unsafe extern "C" fn xmlValidateContent(
7582 ctxt: *mut _xmlValidCtxt,
7583 node: *mut _xmlNode,
7584 doc: *mut _xmlDoc,
7585) -> c_int {
7586 crate::xml::validation::validate_content(ctxt, node, doc)
7587}
7588
7589#[no_mangle]
7597pub unsafe extern "C" fn xmlIsMixedElement(doc: *mut _xmlDoc, name: *const xmlChar) -> c_int {
7598 crate::xml::validation::is_mixed_element(doc, name)
7599}
7600
7601#[no_mangle]
7609pub unsafe extern "C" fn xmlIsEmptyElement(doc: *mut _xmlDoc, name: *const xmlChar) -> c_int {
7610 crate::xml::validation::is_empty_element(doc, name)
7611}
7612
7613#[no_mangle]
7623pub unsafe extern "C" fn xmlValidateDtd(
7624 ctxt: *mut _xmlValidCtxt,
7625 doc: *mut _xmlDoc,
7626 dtd: *mut _xmlDtd,
7627) -> c_int {
7628 crate::xml::validation::validate_dtd(ctxt, doc, dtd)
7629}
7630
7631#[no_mangle]
7639pub unsafe extern "C" fn xmlValidateDtdFinal(ctxt: *mut _xmlValidCtxt, doc: *mut _xmlDoc) -> c_int {
7640 crate::xml::validation::validate_dtd_final(ctxt, doc)
7641}
7642
7643#[no_mangle]
7653pub unsafe extern "C" fn xmlValidateEnumeration(
7654 ctxt: *mut _xmlValidCtxt,
7655 value: *const xmlChar,
7656 tree: *mut _xmlEnumeration,
7657) -> c_int {
7658 crate::xml::validation::validate_enumeration(ctxt, value, tree)
7659}
7660
7661#[no_mangle]
7675pub extern "C" fn xmlGetBinaryPath() -> *mut c_char {
7676 ptr::null_mut()
7678}
7679
7680#[no_mangle]
7688pub extern "C" fn xmlGetHomeOfBinary() -> *mut c_char {
7689 ptr::null_mut()
7691}
7692
7693#[no_mangle]
7704pub unsafe extern "C" fn xmlSAX2StartDocument(ctx: *mut c_void) {
7705 crate::xml::sax::default::default_sax_handler::startDocument(ctx)
7706}
7707
7708#[no_mangle]
7710pub unsafe extern "C" fn xmlSAX2EndDocument(ctx: *mut c_void) {
7711 crate::xml::sax::default::default_sax_handler::endDocument(ctx)
7712}
7713
7714#[no_mangle]
7716pub unsafe extern "C" fn xmlSAX2StartElementNs(
7717 ctx: *mut c_void,
7718 localname: *const xmlChar,
7719 prefix: *const xmlChar,
7720 URI: *const xmlChar,
7721 nb_namespaces: c_int,
7722 namespaces: *mut *const xmlChar,
7723 nb_attributes: c_int,
7724 nb_defaulted: c_int,
7725 attributes: *mut *const xmlChar,
7726) {
7727 crate::xml::sax::default::default_sax_handler::startElementNs(
7728 ctx,
7729 localname,
7730 prefix,
7731 URI,
7732 nb_namespaces,
7733 namespaces,
7734 nb_attributes,
7735 nb_defaulted,
7736 attributes,
7737 )
7738}
7739
7740#[no_mangle]
7742pub unsafe extern "C" fn xmlSAX2EndElementNs(
7743 ctx: *mut c_void,
7744 localname: *const xmlChar,
7745 prefix: *const xmlChar,
7746 URI: *const xmlChar,
7747) {
7748 crate::xml::sax::default::default_sax_handler::endElementNs(ctx, localname, prefix, URI)
7749}
7750
7751#[no_mangle]
7753pub unsafe extern "C" fn xmlSAX2Characters(ctx: *mut c_void, ch: *const xmlChar, len: c_int) {
7754 crate::xml::sax::default::default_sax_handler::characters(ctx, ch, len)
7755}
7756
7757#[no_mangle]
7759pub unsafe extern "C" fn xmlSAX2IgnorableWhitespace(
7760 ctx: *mut c_void,
7761 ch: *const xmlChar,
7762 len: c_int,
7763) {
7764 crate::xml::sax::default::default_sax_handler::ignorableWhitespace(ctx, ch, len)
7765}
7766
7767#[no_mangle]
7769pub unsafe extern "C" fn xmlSAX2Comment(ctx: *mut c_void, value: *const xmlChar) {
7770 crate::xml::sax::default::default_sax_handler::comment(ctx, value)
7771}
7772
7773#[no_mangle]
7775pub unsafe extern "C" fn xmlSAX2ProcessingInstruction(
7776 ctx: *mut c_void,
7777 target: *const xmlChar,
7778 data: *const xmlChar,
7779) {
7780 crate::xml::sax::default::default_sax_handler::processingInstruction(ctx, target, data)
7781}
7782
7783#[no_mangle]
7785pub unsafe extern "C" fn xmlSAX2CDataBlock(ctx: *mut c_void, value: *const xmlChar, len: c_int) {
7786 crate::xml::sax::default::default_sax_handler::cdataBlock(ctx, value, len)
7787}
7788
7789#[no_mangle]
7791pub unsafe extern "C" fn xmlSAX2InternalSubset(
7792 ctx: *mut c_void,
7793 name: *const xmlChar,
7794 ExternalID: *const xmlChar,
7795 SystemID: *const xmlChar,
7796) {
7797 crate::xml::sax::default::default_sax_handler::internalSubset(ctx, name, ExternalID, SystemID)
7798}
7799
7800#[no_mangle]
7802pub unsafe extern "C" fn xmlSAX2ExternalSubset(
7803 ctx: *mut c_void,
7804 name: *const xmlChar,
7805 ExternalID: *const xmlChar,
7806 SystemID: *const xmlChar,
7807) {
7808 crate::xml::sax::default::default_sax_handler::externalSubset(ctx, name, ExternalID, SystemID)
7809}
7810
7811#[no_mangle]
7813pub unsafe extern "C" fn xmlSAX2EntityDecl(
7814 ctx: *mut c_void,
7815 name: *const xmlChar,
7816 type_: c_int,
7817 publicId: *const xmlChar,
7818 systemId: *const xmlChar,
7819 content: *mut xmlChar,
7820) {
7821 crate::xml::sax::default::default_sax_handler::entityDecl(
7822 ctx, name, type_, publicId, systemId, content,
7823 )
7824}
7825
7826#[no_mangle]
7828pub unsafe extern "C" fn xmlSAX2AttributeDecl(
7829 ctx: *mut c_void,
7830 elem: *const xmlChar,
7831 fullname: *const xmlChar,
7832 type_: c_int,
7833 def: c_int,
7834 defaultValue: *const xmlChar,
7835 tree: *mut crate::abi::structs::_xmlEnumeration,
7836) {
7837 crate::xml::sax::default::default_sax_handler::attributeDecl(
7838 ctx,
7839 elem,
7840 fullname,
7841 type_,
7842 def,
7843 defaultValue,
7844 tree,
7845 )
7846}
7847
7848#[no_mangle]
7850pub unsafe extern "C" fn xmlSAX2ElementDecl(
7851 ctx: *mut c_void,
7852 name: *const xmlChar,
7853 type_: c_int,
7854 content: *mut crate::abi::structs::_xmlElementContent,
7855) {
7856 crate::xml::sax::default::default_sax_handler::elementDecl(ctx, name, type_, content)
7857}
7858
7859#[no_mangle]
7861pub unsafe extern "C" fn xmlSAX2NotationDecl(
7862 ctx: *mut c_void,
7863 name: *const xmlChar,
7864 publicId: *const xmlChar,
7865 systemId: *const xmlChar,
7866) {
7867 crate::xml::sax::default::default_sax_handler::notationDecl(ctx, name, publicId, systemId)
7868}
7869
7870#[no_mangle]
7872pub unsafe extern "C" fn xmlSAX2UnparsedEntityDecl(
7873 ctx: *mut c_void,
7874 name: *const xmlChar,
7875 publicId: *const xmlChar,
7876 systemId: *const xmlChar,
7877 notationName: *const xmlChar,
7878) {
7879 crate::xml::sax::default::default_sax_handler::unparsedEntityDecl(
7880 ctx,
7881 name,
7882 publicId,
7883 systemId,
7884 notationName,
7885 )
7886}
7887
7888#[no_mangle]
7890pub unsafe extern "C" fn xmlSAX2ResolveEntity(
7891 ctx: *mut c_void,
7892 publicId: *const xmlChar,
7893 systemId: *const xmlChar,
7894) -> *mut crate::abi::structs::_xmlParserInput {
7895 crate::xml::sax::default::default_sax_handler::resolveEntity(ctx, publicId, systemId)
7896}
7897
7898#[no_mangle]
7900pub unsafe extern "C" fn xmlSAX2IsStandalone(ctx: *mut c_void) -> c_int {
7901 crate::xml::sax::default::default_sax_handler::isStandalone(ctx)
7902}
7903
7904#[no_mangle]
7906pub unsafe extern "C" fn xmlSAX2HasInternalSubset(ctx: *mut c_void) -> c_int {
7907 crate::xml::sax::default::default_sax_handler::hasInternalSubset(ctx)
7908}
7909
7910#[no_mangle]
7912pub unsafe extern "C" fn xmlSAX2HasExternalSubset(ctx: *mut c_void) -> c_int {
7913 crate::xml::sax::default::default_sax_handler::hasExternalSubset(ctx)
7914}
7915
7916#[no_mangle]
7918pub unsafe extern "C" fn xmlSAX2GetEntity(
7919 ctx: *mut c_void,
7920 name: *const xmlChar,
7921) -> *mut crate::abi::structs::_xmlEntity {
7922 crate::xml::sax::default::default_sax_handler::getEntity(ctx, name)
7923}
7924
7925#[no_mangle]
7927pub unsafe extern "C" fn xmlSAX2GetParameterEntity(
7928 ctx: *mut c_void,
7929 name: *const xmlChar,
7930) -> *mut crate::abi::structs::_xmlEntity {
7931 crate::xml::sax::default::default_sax_handler::getParameterEntity(ctx, name)
7932}
7933
7934#[no_mangle]
7937pub unsafe extern "C" fn xmlSAX2GetLineNumber(ctx: *mut c_void) -> c_int {
7938 crate::xml::sax::default::default_sax_handler::getLineNumber(ctx)
7939}
7940
7941#[no_mangle]
7943pub unsafe extern "C" fn xmlSAX2GetColumnNumber(ctx: *mut c_void) -> c_int {
7944 crate::xml::sax::default::default_sax_handler::getColumnNumber(ctx)
7945}
7946
7947#[no_mangle]
7949pub unsafe extern "C" fn xmlSAX2GetPublicId(ctx: *mut c_void) -> *const xmlChar {
7950 crate::xml::sax::default::default_sax_handler::getPublicId(ctx)
7951}
7952
7953#[no_mangle]
7955pub unsafe extern "C" fn xmlSAX2GetSystemId(ctx: *mut c_void) -> *const xmlChar {
7956 crate::xml::sax::default::default_sax_handler::getSystemId(ctx)
7957}
7958
7959#[no_mangle]
7963pub unsafe extern "C" fn xmlSAX2StartElement(
7964 ctx: *mut c_void,
7965 name: *const xmlChar,
7966 atts: *mut *const xmlChar,
7967) {
7968 crate::xml::sax::dispatch::SaxDispatcher::sax1_start_element(ctx, name, atts);
7972}
7973
7974#[no_mangle]
7976pub unsafe extern "C" fn xmlSAX2EndElement(ctx: *mut c_void, name: *const xmlChar) {
7977 crate::xml::sax::dispatch::SaxDispatcher::sax1_end_element(ctx, name);
7978}
7979
7980#[no_mangle]
7982pub unsafe extern "C" fn xmlSAX2SetDocumentLocator(
7983 ctx: *mut c_void,
7984 loc: *mut crate::abi::callbacks::_xmlSAXLocator,
7985) {
7986 crate::xml::sax::default::default_sax_handler::setDocumentLocator(ctx, loc)
7987}
7988
7989#[no_mangle]
7991pub unsafe extern "C" fn xmlSAX2Reference(ctx: *mut c_void, name: *const xmlChar) {
7992 crate::xml::sax::default::default_sax_handler::reference(ctx, name)
7993}
7994
7995#[cfg(test)]
7996mod tests {
7997 use super::xml_number_to_string;
7998
7999 #[test]
8005 fn test_xml_number_to_string_parity_cases() {
8006 let cases: &[(f64, &str)] = &[
8007 (1234567.891, "1234567.891"),
8008 (0.1 + 0.2, "0.3"),
8009 (1.0 / 3.0, "0.333333333333333"),
8010 (1e20, "1e+20"),
8011 (1e-5, "0.00001"),
8012 (123456789012345678901234567890.0, "1.23456789012346e+29"),
8013 (1e100, "1e+100"),
8014 (-1e100, "-1e+100"),
8015 (1.5e-100, "1.5e-100"),
8016 (1e9, "1000000000"),
8017 (0.00001, "0.00001"),
8018 (9.99e-6, "9.99e-06"),
8019 (2147483646.0, "2147483646"),
8020 (2147483648.0, "2.147483648e+09"),
8021 (-2147483647.0, "-2147483647"),
8022 (-2147483649.0, "-2.147483649e+09"),
8023 (0.5, "0.5"),
8024 (1.0 / 7.0, "0.142857142857143"),
8025 (2.675, "2.675"),
8026 (3.141592653589793, "3.141592653589793"),
8027 (-0.0, "0"),
8028 (0.0, "0"),
8029 (f64::INFINITY, "Infinity"),
8030 (f64::NEG_INFINITY, "-Infinity"),
8031 (f64::NAN, "NaN"),
8032 (0.30000000000000004, "0.3"),
8033 (2.2250738585072014e-308, "2.2250738585072e-308"),
8034 (5e-324, "4.94065645841247e-324"),
8035 ];
8036 for (n, expected) in cases {
8037 assert_eq!(&xml_number_to_string(*n), expected, "value: {}", n);
8038 }
8039 }
8040}