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