unsafe_libyaml/
writer.rs
1use crate::ops::ForceAdd as _;
2use crate::success::{Success, FAIL, OK};
3use crate::yaml::size_t;
4use crate::{
5 libc, yaml_emitter_t, PointerExt, YAML_ANY_ENCODING, YAML_UTF16LE_ENCODING, YAML_UTF8_ENCODING,
6 YAML_WRITER_ERROR,
7};
8use core::ptr::addr_of_mut;
9
10unsafe 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
20pub 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}