use crate::ops::ForceAdd as _; use crate::success::{Success, FAIL, OK}; use crate::yaml::size_t; use crate::{ libc, yaml_emitter_t, PointerExt, YAML_ANY_ENCODING, YAML_UTF16LE_ENCODING, YAML_UTF8_ENCODING, YAML_WRITER_ERROR, }; use core::ptr::addr_of_mut; unsafe fn yaml_emitter_set_writer_error( emitter: *mut yaml_emitter_t, problem: *const libc::c_char, ) -> Success { (*emitter).error = YAML_WRITER_ERROR; let fresh0 = addr_of_mut!((*emitter).problem); *fresh0 = problem; FAIL } /// Flush the accumulated characters to the output. pub unsafe fn yaml_emitter_flush(emitter: *mut yaml_emitter_t) -> Success { __assert!(!emitter.is_null()); __assert!(((*emitter).write_handler).is_some()); __assert!((*emitter).encoding != YAML_ANY_ENCODING); let fresh1 = addr_of_mut!((*emitter).buffer.last); *fresh1 = (*emitter).buffer.pointer; let fresh2 = addr_of_mut!((*emitter).buffer.pointer); *fresh2 = (*emitter).buffer.start; if (*emitter).buffer.start == (*emitter).buffer.last { return OK; } if (*emitter).encoding == YAML_UTF8_ENCODING { if (*emitter).write_handler.expect("non-null function pointer")( (*emitter).write_handler_data, (*emitter).buffer.start, (*emitter) .buffer .last .c_offset_from((*emitter).buffer.start) as size_t, ) != 0 { let fresh3 = addr_of_mut!((*emitter).buffer.last); *fresh3 = (*emitter).buffer.start; let fresh4 = addr_of_mut!((*emitter).buffer.pointer); *fresh4 = (*emitter).buffer.start; return OK; } else { return yaml_emitter_set_writer_error( emitter, b"write error\0" as *const u8 as *const libc::c_char, ); } } let low: libc::c_int = if (*emitter).encoding == YAML_UTF16LE_ENCODING { 0 } else { 1 }; let high: libc::c_int = if (*emitter).encoding == YAML_UTF16LE_ENCODING { 1 } else { 0 }; while (*emitter).buffer.pointer != (*emitter).buffer.last { let mut octet: libc::c_uchar; let mut value: libc::c_uint; let mut k: size_t; octet = *(*emitter).buffer.pointer; let width: libc::c_uint = if octet & 0x80 == 0 { 1 } else if octet & 0xE0 == 0xC0 { 2 } else if octet & 0xF0 == 0xE0 { 3 } else if octet & 0xF8 == 0xF0 { 4 } else { 0 } as libc::c_uint; value = if octet & 0x80 == 0 { octet & 0x7F } else if octet & 0xE0 == 0xC0 { octet & 0x1F } else if octet & 0xF0 == 0xE0 { octet & 0xF } else if octet & 0xF8 == 0xF0 { octet & 0x7 } else { 0 } as libc::c_uint; k = 1_u64; while k < width as libc::c_ulong { octet = *(*emitter).buffer.pointer.wrapping_offset(k as isize); value = (value << 6).force_add((octet & 0x3F) as libc::c_uint); k = k.force_add(1); } let fresh5 = addr_of_mut!((*emitter).buffer.pointer); *fresh5 = (*fresh5).wrapping_offset(width as isize); if value < 0x10000 { *(*emitter).raw_buffer.last.wrapping_offset(high as isize) = (value >> 8) as libc::c_uchar; *(*emitter).raw_buffer.last.wrapping_offset(low as isize) = (value & 0xFF) as libc::c_uchar; let fresh6 = addr_of_mut!((*emitter).raw_buffer.last); *fresh6 = (*fresh6).wrapping_offset(2_isize); } else { value = value.wrapping_sub(0x10000); *(*emitter).raw_buffer.last.wrapping_offset(high as isize) = 0xD8_u32.force_add(value >> 18) as libc::c_uchar; *(*emitter).raw_buffer.last.wrapping_offset(low as isize) = (value >> 10 & 0xFF) as libc::c_uchar; *(*emitter) .raw_buffer .last .wrapping_offset((high + 2) as isize) = 0xDC_u32.force_add(value >> 8 & 0xFF) as libc::c_uchar; *(*emitter) .raw_buffer .last .wrapping_offset((low + 2) as isize) = (value & 0xFF) as libc::c_uchar; let fresh7 = addr_of_mut!((*emitter).raw_buffer.last); *fresh7 = (*fresh7).wrapping_offset(4_isize); } } if (*emitter).write_handler.expect("non-null function pointer")( (*emitter).write_handler_data, (*emitter).raw_buffer.start, (*emitter) .raw_buffer .last .c_offset_from((*emitter).raw_buffer.start) as size_t, ) != 0 { let fresh8 = addr_of_mut!((*emitter).buffer.last); *fresh8 = (*emitter).buffer.start; let fresh9 = addr_of_mut!((*emitter).buffer.pointer); *fresh9 = (*emitter).buffer.start; let fresh10 = addr_of_mut!((*emitter).raw_buffer.last); *fresh10 = (*emitter).raw_buffer.start; let fresh11 = addr_of_mut!((*emitter).raw_buffer.pointer); *fresh11 = (*emitter).raw_buffer.start; OK } else { yaml_emitter_set_writer_error( emitter, b"write error\0" as *const u8 as *const libc::c_char, ) } }