150 lines
5.3 KiB
Rust
150 lines
5.3 KiB
Rust
|
|
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,
|
||
|
|
)
|
||
|
|
}
|
||
|
|
}
|