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
18pub 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}