Skip to main content

unsafe_libyaml/
writer.rs

1use core::ptr::addr_of_mut;
2
3use crate::{
4    PointerExt, YAML_ANY_ENCODING, YAML_UTF8_ENCODING, YAML_UTF16LE_ENCODING, YAML_WRITER_ERROR, libc,
5    ops::ForceAdd as _,
6    success::{FAIL, OK, Success},
7    yaml::size_t,
8    yaml_emitter_t,
9};
10
11unsafe fn yaml_emitter_set_writer_error(emitter: *mut yaml_emitter_t, problem: *const libc::c_char) -> Success {
12    (*emitter).error = YAML_WRITER_ERROR;
13    let fresh0 = addr_of_mut!((*emitter).problem);
14    *fresh0 = problem;
15    FAIL
16}
17
18/// Flush the accumulated characters to the output.
19pub unsafe fn yaml_emitter_flush(emitter: *mut yaml_emitter_t) -> Success {
20    __assert!(!emitter.is_null());
21    __assert!(((*emitter).write_handler).is_some());
22    __assert!((*emitter).encoding != YAML_ANY_ENCODING);
23    let fresh1 = addr_of_mut!((*emitter).buffer.last);
24    *fresh1 = (*emitter).buffer.pointer;
25    let fresh2 = addr_of_mut!((*emitter).buffer.pointer);
26    *fresh2 = (*emitter).buffer.start;
27    if (*emitter).buffer.start == (*emitter).buffer.last {
28        return OK;
29    }
30    if (*emitter).encoding == YAML_UTF8_ENCODING {
31        if (*emitter).write_handler.expect("non-null function pointer")(
32            (*emitter).write_handler_data,
33            (*emitter).buffer.start,
34            (*emitter).buffer.last.c_offset_from((*emitter).buffer.start) as size_t,
35        ) != 0
36        {
37            let fresh3 = addr_of_mut!((*emitter).buffer.last);
38            *fresh3 = (*emitter).buffer.start;
39            let fresh4 = addr_of_mut!((*emitter).buffer.pointer);
40            *fresh4 = (*emitter).buffer.start;
41            return OK;
42        } else {
43            return yaml_emitter_set_writer_error(emitter, b"write error\0" as *const u8 as *const libc::c_char);
44        }
45    }
46    let low: libc::c_int = if (*emitter).encoding == YAML_UTF16LE_ENCODING {
47        0
48    } else {
49        1
50    };
51    let high: libc::c_int = if (*emitter).encoding == YAML_UTF16LE_ENCODING {
52        1
53    } else {
54        0
55    };
56    while (*emitter).buffer.pointer != (*emitter).buffer.last {
57        let mut octet: libc::c_uchar;
58        let mut value: libc::c_uint;
59        let mut k: size_t;
60        octet = *(*emitter).buffer.pointer;
61        let width: libc::c_uint = if octet & 0x80 == 0 {
62            1
63        } else if octet & 0xE0 == 0xC0 {
64            2
65        } else if octet & 0xF0 == 0xE0 {
66            3
67        } else if octet & 0xF8 == 0xF0 {
68            4
69        } else {
70            0
71        } as libc::c_uint;
72        value = if octet & 0x80 == 0 {
73            octet & 0x7F
74        } else if octet & 0xE0 == 0xC0 {
75            octet & 0x1F
76        } else if octet & 0xF0 == 0xE0 {
77            octet & 0xF
78        } else if octet & 0xF8 == 0xF0 {
79            octet & 0x7
80        } else {
81            0
82        } as libc::c_uint;
83        k = 1_u64;
84        while k < width as libc::c_ulong {
85            octet = *(*emitter).buffer.pointer.wrapping_offset(k as isize);
86            value = (value << 6).force_add((octet & 0x3F) as libc::c_uint);
87            k = k.force_add(1);
88        }
89        let fresh5 = addr_of_mut!((*emitter).buffer.pointer);
90        *fresh5 = (*fresh5).wrapping_offset(width as isize);
91        if value < 0x10000 {
92            *(*emitter).raw_buffer.last.wrapping_offset(high as isize) = (value >> 8) as libc::c_uchar;
93            *(*emitter).raw_buffer.last.wrapping_offset(low as isize) = (value & 0xFF) as libc::c_uchar;
94            let fresh6 = addr_of_mut!((*emitter).raw_buffer.last);
95            *fresh6 = (*fresh6).wrapping_offset(2_isize);
96        } else {
97            value = value.wrapping_sub(0x10000);
98            *(*emitter).raw_buffer.last.wrapping_offset(high as isize) =
99                0xD8_u32.force_add(value >> 18) as libc::c_uchar;
100            *(*emitter).raw_buffer.last.wrapping_offset(low as isize) = (value >> 10 & 0xFF) as libc::c_uchar;
101            *(*emitter).raw_buffer.last.wrapping_offset((high + 2) as isize) =
102                0xDC_u32.force_add(value >> 8 & 0xFF) as libc::c_uchar;
103            *(*emitter).raw_buffer.last.wrapping_offset((low + 2) as isize) = (value & 0xFF) as libc::c_uchar;
104            let fresh7 = addr_of_mut!((*emitter).raw_buffer.last);
105            *fresh7 = (*fresh7).wrapping_offset(4_isize);
106        }
107    }
108    if (*emitter).write_handler.expect("non-null function pointer")(
109        (*emitter).write_handler_data,
110        (*emitter).raw_buffer.start,
111        (*emitter).raw_buffer.last.c_offset_from((*emitter).raw_buffer.start) as size_t,
112    ) != 0
113    {
114        let fresh8 = addr_of_mut!((*emitter).buffer.last);
115        *fresh8 = (*emitter).buffer.start;
116        let fresh9 = addr_of_mut!((*emitter).buffer.pointer);
117        *fresh9 = (*emitter).buffer.start;
118        let fresh10 = addr_of_mut!((*emitter).raw_buffer.last);
119        *fresh10 = (*emitter).raw_buffer.start;
120        let fresh11 = addr_of_mut!((*emitter).raw_buffer.pointer);
121        *fresh11 = (*emitter).raw_buffer.start;
122        OK
123    } else {
124        yaml_emitter_set_writer_error(emitter, b"write error\0" as *const u8 as *const libc::c_char)
125    }
126}