Files
chatmail-core/mmime/src/mailmime/write_generic.rs
2019-09-26 12:36:23 +02:00

1980 lines
72 KiB
Rust

use std::ffi::CStr;
use crate::clist::*;
use crate::mailimf::write_generic::*;
use crate::mailmime::content::*;
use crate::mailmime::types::*;
use crate::mailmime::types_helper::*;
use crate::mailmime::*;
use crate::other::*;
pub const STATE_INIT: libc::c_uint = 0;
pub const STATE_SPACE_CR: libc::c_uint = 3;
pub const STATE_SPACE: libc::c_uint = 2;
pub const STATE_CR: libc::c_uint = 1;
pub unsafe fn mailmime_fields_write_driver(
mut do_write: Option<
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
>,
mut data: *mut libc::c_void,
mut col: *mut libc::c_int,
mut fields: *mut mailmime_fields,
) -> libc::c_int {
let mut r: libc::c_int = 0;
let mut cur: *mut clistiter = 0 as *mut clistiter;
cur = (*(*fields).fld_list).first;
while !cur.is_null() {
let mut field: *mut mailmime_field = 0 as *mut mailmime_field;
field = (*cur).data as *mut mailmime_field;
r = mailmime_field_write_driver(do_write, data, col, field);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
cur = if !cur.is_null() {
(*cur).next
} else {
0 as *mut clistcell
}
}
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailmime_field_write_driver(
mut do_write: Option<
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
>,
mut data: *mut libc::c_void,
mut col: *mut libc::c_int,
mut field: *mut mailmime_field,
) -> libc::c_int {
let mut r: libc::c_int = 0;
match (*field).fld_type {
1 => r = mailmime_content_write_driver(do_write, data, col, (*field).fld_data.fld_content),
2 => {
r = mailmime_encoding_write_driver(do_write, data, col, (*field).fld_data.fld_encoding)
}
3 => r = mailmime_id_write_driver(do_write, data, col, (*field).fld_data.fld_id),
4 => {
r = mailmime_description_write_driver(
do_write,
data,
col,
(*field).fld_data.fld_description,
)
}
5 => r = mailmime_version_write_driver(do_write, data, col, (*field).fld_data.fld_version),
6 => {
r = mailmime_disposition_write_driver(
do_write,
data,
col,
(*field).fld_data.fld_disposition,
)
}
7 => {
r = mailmime_language_write_driver(do_write, data, col, (*field).fld_data.fld_language)
}
8 => {
r = mailmime_location_write_driver(do_write, data, col, (*field).fld_data.fld_location)
}
_ => r = MAILIMF_ERROR_INVAL as libc::c_int,
}
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailmime_location_write_driver(
mut do_write: Option<
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
>,
mut data: *mut libc::c_void,
mut col: *mut libc::c_int,
mut location: *mut libc::c_char,
) -> libc::c_int {
let mut r: libc::c_int = 0;
let mut len: libc::c_int = strlen(location) as libc::c_int;
r = mailimf_string_write_driver(
do_write,
data,
col,
b"Content-Location: \x00" as *const u8 as *const libc::c_char,
18i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
if *col > 1i32 && *col + len > 78i32 {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"\r\n \x00" as *const u8 as *const libc::c_char,
3i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
}
r = mailimf_string_write_driver(do_write, data, col, location, len as size_t);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailimf_string_write_driver(
do_write,
data,
col,
b"\r\n\x00" as *const u8 as *const libc::c_char,
2i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailmime_language_write_driver(
mut do_write: Option<
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
>,
mut data: *mut libc::c_void,
mut col: *mut libc::c_int,
mut language: *mut mailmime_language,
) -> libc::c_int {
let mut r: libc::c_int = 0;
let mut cur: *mut clistiter = 0 as *mut clistiter;
let mut first: libc::c_int = 0;
r = mailimf_string_write_driver(
do_write,
data,
col,
b"Content-Language: \x00" as *const u8 as *const libc::c_char,
18i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
first = 1i32;
cur = (*(*language).lg_list).first;
while !cur.is_null() {
let mut lang: *mut libc::c_char = 0 as *mut libc::c_char;
let mut len: size_t = 0;
lang = (if !cur.is_null() {
(*cur).data
} else {
0 as *mut libc::c_void
}) as *mut libc::c_char;
len = strlen(lang);
if 0 == first {
r = mailimf_string_write_driver(
do_write,
data,
col,
b", \x00" as *const u8 as *const libc::c_char,
2i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
} else {
first = 0i32
}
if *col > 1i32 {
if (*col as libc::size_t).wrapping_add(len) > 78i32 as libc::size_t {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"\r\n \x00" as *const u8 as *const libc::c_char,
3i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
}
}
r = mailimf_string_write_driver(do_write, data, col, lang, len);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
cur = if !cur.is_null() {
(*cur).next
} else {
0 as *mut clistcell
}
}
r = mailimf_string_write_driver(
do_write,
data,
col,
b"\r\n\x00" as *const u8 as *const libc::c_char,
2i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailmime_disposition_write_driver(
mut do_write: Option<
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
>,
mut data: *mut libc::c_void,
mut col: *mut libc::c_int,
mut disposition: *mut mailmime_disposition,
) -> libc::c_int {
let mut dsp_type: *mut mailmime_disposition_type = 0 as *mut mailmime_disposition_type;
let mut r: libc::c_int = 0;
let mut cur: *mut clistiter = 0 as *mut clistiter;
dsp_type = (*disposition).dsp_type;
r = mailimf_string_write_driver(
do_write,
data,
col,
b"Content-Disposition: \x00" as *const u8 as *const libc::c_char,
21i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
match (*dsp_type).dsp_type {
1 => {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"inline\x00" as *const u8 as *const libc::c_char,
6i32 as size_t,
)
}
2 => {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"attachment\x00" as *const u8 as *const libc::c_char,
10i32 as size_t,
)
}
3 => {
r = mailimf_string_write_driver(
do_write,
data,
col,
(*dsp_type).dsp_extension,
strlen((*dsp_type).dsp_extension),
)
}
_ => r = MAILIMF_ERROR_INVAL as libc::c_int,
}
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
cur = (*(*disposition).dsp_parms).first;
while !cur.is_null() {
let mut param: *mut mailmime_disposition_parm = 0 as *mut mailmime_disposition_parm;
param = (*cur).data as *mut mailmime_disposition_parm;
r = mailimf_string_write_driver(
do_write,
data,
col,
b"; \x00" as *const u8 as *const libc::c_char,
2i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailmime_disposition_param_write_driver(do_write, data, col, param);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
cur = if !cur.is_null() {
(*cur).next
} else {
0 as *mut clistcell
}
}
r = mailimf_string_write_driver(
do_write,
data,
col,
b"\r\n\x00" as *const u8 as *const libc::c_char,
2i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailmime_disposition_param_write_driver(
mut do_write: Option<
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
>,
mut data: *mut libc::c_void,
mut col: *mut libc::c_int,
mut param: *mut mailmime_disposition_parm,
) -> libc::c_int {
let mut len: size_t = 0;
let mut r: libc::c_int = 0;
let mut sizestr: *mut libc::c_char = std::ptr::null_mut();
match (*param).pa_type {
0 => {
len = strlen(b"filename=\x00" as *const u8 as *const libc::c_char)
.wrapping_add(strlen((*param).pa_data.pa_filename))
}
1 => {
len = strlen(b"creation-date=\x00" as *const u8 as *const libc::c_char)
.wrapping_add(strlen((*param).pa_data.pa_creation_date))
}
2 => {
len = strlen(b"modification-date=\x00" as *const u8 as *const libc::c_char)
.wrapping_add(strlen((*param).pa_data.pa_modification_date))
}
3 => {
len = strlen(b"read-date=\x00" as *const u8 as *const libc::c_char)
.wrapping_add(strlen((*param).pa_data.pa_read_date))
}
4 => {
let value = (*param).pa_data.pa_size as u32;
let raw = format!("{}", value);
let raw_c = std::ffi::CString::new(raw).unwrap();
sizestr = strdup(raw_c.as_ptr());
len = strlen(b"size=\x00" as *const u8 as *const libc::c_char)
.wrapping_add(strlen(sizestr))
}
5 => {
len = strlen((*(*param).pa_data.pa_parameter).pa_name)
.wrapping_add(1i32 as libc::size_t)
.wrapping_add(strlen((*(*param).pa_data.pa_parameter).pa_value))
}
_ => return MAILIMF_ERROR_INVAL as libc::c_int,
}
if *col > 1i32 {
if (*col as libc::size_t).wrapping_add(len) > 78i32 as libc::size_t {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"\r\n \x00" as *const u8 as *const libc::c_char,
3i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
}
}
match (*param).pa_type {
0 => {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"filename=\x00" as *const u8 as *const libc::c_char,
9i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailimf_quoted_string_write_driver(
do_write,
data,
col,
(*param).pa_data.pa_filename,
strlen((*param).pa_data.pa_filename),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
}
1 => {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"creation-date=\x00" as *const u8 as *const libc::c_char,
14i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailimf_quoted_string_write_driver(
do_write,
data,
col,
(*param).pa_data.pa_creation_date,
strlen((*param).pa_data.pa_creation_date),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
}
2 => {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"modification-date=\x00" as *const u8 as *const libc::c_char,
18i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailimf_quoted_string_write_driver(
do_write,
data,
col,
(*param).pa_data.pa_modification_date,
strlen((*param).pa_data.pa_modification_date),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
}
3 => {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"read-date=\x00" as *const u8 as *const libc::c_char,
10i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailimf_quoted_string_write_driver(
do_write,
data,
col,
(*param).pa_data.pa_read_date,
strlen((*param).pa_data.pa_read_date),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
}
4 => {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"size=\x00" as *const u8 as *const libc::c_char,
5i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailimf_string_write_driver(do_write, data, col, sizestr, strlen(sizestr));
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
}
5 => {
r = mailmime_parameter_write_driver(do_write, data, col, (*param).pa_data.pa_parameter);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
}
_ => {}
}
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailmime_parameter_write_driver(
mut do_write: Option<
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
>,
mut data: *mut libc::c_void,
mut col: *mut libc::c_int,
mut param: *mut mailmime_parameter,
) -> libc::c_int {
let mut r: libc::c_int = 0;
r = mailimf_string_write_driver(
do_write,
data,
col,
(*param).pa_name,
strlen((*param).pa_name),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailimf_string_write_driver(
do_write,
data,
col,
b"=\x00" as *const u8 as *const libc::c_char,
1i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailimf_quoted_string_write_driver(
do_write,
data,
col,
(*param).pa_value,
strlen((*param).pa_value),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailmime_version_write_driver(
mut do_write: Option<
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
>,
mut data: *mut libc::c_void,
mut col: *mut libc::c_int,
mut version: uint32_t,
) -> libc::c_int {
let mut r: libc::c_int = 0;
r = mailimf_string_write_driver(
do_write,
data,
col,
b"MIME-Version: \x00" as *const u8 as *const libc::c_char,
14i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
let raw = format!("{}.{}", (version >> 16) as i32, (version & 0xffff) as i32);
let raw_c = std::ffi::CString::new(raw).unwrap();
let mut versionstr = strdup(raw_c.as_ptr());
r = mailimf_string_write_driver(do_write, data, col, versionstr, strlen(versionstr));
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailimf_string_write_driver(
do_write,
data,
col,
b"\r\n\x00" as *const u8 as *const libc::c_char,
2i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailmime_description_write_driver(
mut do_write: Option<
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
>,
mut data: *mut libc::c_void,
mut col: *mut libc::c_int,
mut descr: *mut libc::c_char,
) -> libc::c_int {
let mut r: libc::c_int = 0;
r = mailimf_string_write_driver(
do_write,
data,
col,
b"Content-Description: \x00" as *const u8 as *const libc::c_char,
21i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailimf_string_write_driver(do_write, data, col, descr, strlen(descr));
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailimf_string_write_driver(
do_write,
data,
col,
b"\r\n\x00" as *const u8 as *const libc::c_char,
2i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailmime_id_write_driver(
mut do_write: Option<
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
>,
mut data: *mut libc::c_void,
mut col: *mut libc::c_int,
mut id: *mut libc::c_char,
) -> libc::c_int {
let mut r: libc::c_int = 0;
r = mailimf_string_write_driver(
do_write,
data,
col,
b"Content-ID: \x00" as *const u8 as *const libc::c_char,
12i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailimf_string_write_driver(
do_write,
data,
col,
b"<\x00" as *const u8 as *const libc::c_char,
1i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailimf_string_write_driver(do_write, data, col, id, strlen(id));
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailimf_string_write_driver(
do_write,
data,
col,
b">\x00" as *const u8 as *const libc::c_char,
1i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailimf_string_write_driver(
do_write,
data,
col,
b"\r\n\x00" as *const u8 as *const libc::c_char,
2i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailmime_encoding_write_driver(
mut do_write: Option<
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
>,
mut data: *mut libc::c_void,
mut col: *mut libc::c_int,
mut encoding: *mut mailmime_mechanism,
) -> libc::c_int {
let mut r: libc::c_int = 0;
r = mailimf_string_write_driver(
do_write,
data,
col,
b"Content-Transfer-Encoding: \x00" as *const u8 as *const libc::c_char,
27i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
match (*encoding).enc_type {
1 => {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"7bit\x00" as *const u8 as *const libc::c_char,
4i32 as size_t,
)
}
2 => {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"8bit\x00" as *const u8 as *const libc::c_char,
4i32 as size_t,
)
}
3 => {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"binary\x00" as *const u8 as *const libc::c_char,
6i32 as size_t,
)
}
4 => {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"quoted-printable\x00" as *const u8 as *const libc::c_char,
16i32 as size_t,
)
}
5 => {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"base64\x00" as *const u8 as *const libc::c_char,
6i32 as size_t,
)
}
6 => {
r = mailimf_string_write_driver(
do_write,
data,
col,
(*encoding).enc_token,
strlen((*encoding).enc_token),
)
}
_ => r = MAILIMF_ERROR_INVAL as libc::c_int,
}
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailimf_string_write_driver(
do_write,
data,
col,
b"\r\n\x00" as *const u8 as *const libc::c_char,
2i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
return MAILIMF_NO_ERROR as libc::c_int;
}
pub unsafe fn mailmime_content_write_driver(
mut do_write: Option<
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
>,
mut data: *mut libc::c_void,
mut col: *mut libc::c_int,
mut content: *mut mailmime_content,
) -> libc::c_int {
let mut r: libc::c_int = 0;
r = mailimf_string_write_driver(
do_write,
data,
col,
b"Content-Type: \x00" as *const u8 as *const libc::c_char,
14i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailmime_content_type_write_driver(do_write, data, col, content);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailimf_string_write_driver(
do_write,
data,
col,
b"\r\n\x00" as *const u8 as *const libc::c_char,
2i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
return MAILIMF_NO_ERROR as libc::c_int;
}
pub unsafe fn mailmime_content_type_write_driver(
mut do_write: Option<
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
>,
mut data: *mut libc::c_void,
mut col: *mut libc::c_int,
mut content: *mut mailmime_content,
) -> libc::c_int {
let mut cur: *mut clistiter = 0 as *mut clistiter;
let mut len: size_t = 0;
let mut r: libc::c_int = 0;
r = mailmime_type_write_driver(do_write, data, col, (*content).ct_type);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailimf_string_write_driver(
do_write,
data,
col,
b"/\x00" as *const u8 as *const libc::c_char,
1i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailimf_string_write_driver(
do_write,
data,
col,
(*content).ct_subtype,
strlen((*content).ct_subtype),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
if !(*content).ct_parameters.is_null() {
cur = (*(*content).ct_parameters).first;
while !cur.is_null() {
let mut param: *mut mailmime_parameter = 0 as *mut mailmime_parameter;
param = (*cur).data as *mut mailmime_parameter;
r = mailimf_string_write_driver(
do_write,
data,
col,
b"; \x00" as *const u8 as *const libc::c_char,
2i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
len = strlen((*param).pa_name)
.wrapping_add(1i32 as libc::size_t)
.wrapping_add(strlen((*param).pa_value));
if *col > 1i32 {
if (*col as libc::size_t).wrapping_add(len) > 78i32 as libc::size_t {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"\r\n \x00" as *const u8 as *const libc::c_char,
3i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
}
}
r = mailmime_parameter_write_driver(do_write, data, col, param);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
cur = if !cur.is_null() {
(*cur).next
} else {
0 as *mut clistcell
}
}
}
return MAILIMF_NO_ERROR as libc::c_int;
}
/*
static int mailmime_content_write_driver(int (* do_write)(void *, const char *, size_t), void * data, int * col,
struct mailmime_content * content);
*/
unsafe fn mailmime_type_write_driver(
mut do_write: Option<
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
>,
mut data: *mut libc::c_void,
mut col: *mut libc::c_int,
mut type_0: *mut mailmime_type,
) -> libc::c_int {
let mut r: libc::c_int = 0;
match (*type_0).tp_type {
1 => {
r = mailmime_discrete_type_write_driver(
do_write,
data,
col,
(*type_0).tp_data.tp_discrete_type,
)
}
2 => {
r = mailmime_composite_type_write_driver(
do_write,
data,
col,
(*type_0).tp_data.tp_composite_type,
)
}
_ => r = MAILIMF_ERROR_INVAL as libc::c_int,
}
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailmime_composite_type_write_driver(
mut do_write: Option<
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
>,
mut data: *mut libc::c_void,
mut col: *mut libc::c_int,
mut composite_type: *mut mailmime_composite_type,
) -> libc::c_int {
let mut r: libc::c_int = 0;
match (*composite_type).ct_type {
1 => {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"message\x00" as *const u8 as *const libc::c_char,
7i32 as size_t,
)
}
2 => {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"multipart\x00" as *const u8 as *const libc::c_char,
9i32 as size_t,
)
}
3 => {
r = mailimf_string_write_driver(
do_write,
data,
col,
(*composite_type).ct_token,
strlen((*composite_type).ct_token),
)
}
_ => r = MAILIMF_ERROR_INVAL as libc::c_int,
}
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailmime_discrete_type_write_driver(
mut do_write: Option<
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
>,
mut data: *mut libc::c_void,
mut col: *mut libc::c_int,
mut discrete_type: *mut mailmime_discrete_type,
) -> libc::c_int {
let mut r: libc::c_int = 0;
match (*discrete_type).dt_type {
1 => {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"text\x00" as *const u8 as *const libc::c_char,
4i32 as size_t,
)
}
2 => {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"image\x00" as *const u8 as *const libc::c_char,
5i32 as size_t,
)
}
3 => {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"audio\x00" as *const u8 as *const libc::c_char,
5i32 as size_t,
)
}
4 => {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"video\x00" as *const u8 as *const libc::c_char,
5i32 as size_t,
)
}
5 => {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"application\x00" as *const u8 as *const libc::c_char,
11i32 as size_t,
)
}
6 => {
r = mailimf_string_write_driver(
do_write,
data,
col,
(*discrete_type).dt_extension,
strlen((*discrete_type).dt_extension),
)
}
_ => r = MAILIMF_ERROR_INVAL as libc::c_int,
}
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
return MAILIMF_NO_ERROR as libc::c_int;
}
pub unsafe fn mailmime_write_driver(
mut do_write: Option<
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
>,
mut data: *mut libc::c_void,
mut col: *mut libc::c_int,
mut build_info: *mut Mailmime,
) -> libc::c_int {
if !(*build_info).mm_parent.is_null() {
return mailmime_sub_write_driver(do_write, data, col, build_info);
} else {
return mailmime_part_write_driver(do_write, data, col, build_info);
};
}
/*
static int mailmime_base64_write_driver(int (* do_write)(void *, const char *, size_t), void * data, int * col,
char * text, size_t size);
static int mailmime_quoted_printable_write_driver(int (* do_write)(void *, const char *, size_t), void * data, int * col, int istext,
char * text, size_t size);
*/
unsafe fn mailmime_part_write_driver(
mut do_write: Option<
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
>,
mut data: *mut libc::c_void,
mut col: *mut libc::c_int,
mut build_info: *mut Mailmime,
) -> libc::c_int {
let mut current_block: u64;
let mut cur: *mut clistiter = 0 as *mut clistiter;
let mut first: libc::c_int = 0;
let mut r: libc::c_int = 0;
let mut boundary: *mut libc::c_char = 0 as *mut libc::c_char;
let mut istext: libc::c_int = 0;
let mut res: libc::c_int = 0;
istext = 1i32;
boundary = 0 as *mut libc::c_char;
if !(*build_info).mm_content_type.is_null() {
if (*build_info).mm_type == MAILMIME_MULTIPLE as libc::c_int {
boundary = mailmime_extract_boundary((*build_info).mm_content_type);
if boundary.is_null() {
boundary = mailmime_generate_boundary();
if boundary.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int;
current_block = 13530634675565645571;
} else {
current_block = 13586036798005543211;
}
} else {
current_block = 13586036798005543211;
}
} else {
current_block = 13586036798005543211;
}
match current_block {
13530634675565645571 => {}
_ => {
if (*(*(*build_info).mm_content_type).ct_type).tp_type
== MAILMIME_TYPE_DISCRETE_TYPE as libc::c_int
{
if (*(*(*(*build_info).mm_content_type).ct_type)
.tp_data
.tp_discrete_type)
.dt_type
!= MAILMIME_DISCRETE_TYPE_TEXT as libc::c_int
{
istext = 0i32
}
}
current_block = 8457315219000651999;
}
}
} else {
current_block = 8457315219000651999;
}
match current_block {
8457315219000651999 => {
match (*build_info).mm_type {
1 => {
/* 1-part body */
if !(*build_info).mm_data.mm_single.is_null() {
r = mailmime_data_write_driver(
do_write,
data,
col,
(*build_info).mm_data.mm_single,
istext,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r;
current_block = 16754986508692159943;
} else {
current_block = 7639320476250304355;
}
} else {
current_block = 7639320476250304355;
}
}
2 => {
/* multi-part */
/* preamble */
if !(*build_info).mm_data.mm_multipart.mm_preamble.is_null() {
r = mailmime_data_write_driver(
do_write,
data,
col,
(*build_info).mm_data.mm_multipart.mm_preamble,
1i32,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r;
current_block = 16754986508692159943;
} else {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"\r\n\x00" as *const u8 as *const libc::c_char,
2i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r;
current_block = 16754986508692159943;
} else {
current_block = 17500079516916021833;
}
}
} else {
current_block = 17500079516916021833;
}
match current_block {
16754986508692159943 => {}
_ => {
first = 1i32;
cur = (*(*build_info).mm_data.mm_multipart.mm_mp_list).first;
loop {
if cur.is_null() {
current_block = 3546145585875536353;
break;
}
let mut subpart: *mut Mailmime = 0 as *mut Mailmime;
subpart = (*cur).data as *mut Mailmime;
if 0 == first {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"\r\n\x00" as *const u8 as *const libc::c_char,
2i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r;
current_block = 16754986508692159943;
break;
}
} else {
first = 0i32
}
r = mailimf_string_write_driver(
do_write,
data,
col,
b"--\x00" as *const u8 as *const libc::c_char,
2i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r;
current_block = 16754986508692159943;
break;
} else if boundary.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int;
current_block = 16754986508692159943;
break;
} else {
r = mailimf_string_write_driver(
do_write,
data,
col,
boundary,
strlen(boundary),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r;
current_block = 16754986508692159943;
break;
} else {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"\r\n\x00" as *const u8 as *const libc::c_char,
2i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r;
current_block = 16754986508692159943;
break;
} else {
r = mailmime_sub_write_driver(
do_write, data, col, subpart,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r;
current_block = 16754986508692159943;
break;
} else {
cur = if !cur.is_null() {
(*cur).next
} else {
0 as *mut clistcell
}
}
}
}
}
}
match current_block {
16754986508692159943 => {}
_ => {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"\r\n\x00" as *const u8 as *const libc::c_char,
2i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r;
current_block = 16754986508692159943;
} else {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"--\x00" as *const u8 as *const libc::c_char,
2i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r;
current_block = 16754986508692159943;
} else if boundary.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int;
current_block = 16754986508692159943;
} else {
r = mailimf_string_write_driver(
do_write,
data,
col,
boundary,
strlen(boundary),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r;
current_block = 16754986508692159943;
} else {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"--\x00" as *const u8 as *const libc::c_char,
2i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r;
current_block = 16754986508692159943;
} else {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"\r\n\x00" as *const u8
as *const libc::c_char,
2i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r;
current_block = 16754986508692159943;
} else if !(*build_info)
.mm_data
.mm_multipart
.mm_epilogue
.is_null()
{
r = mailmime_data_write_driver(
do_write,
data,
col,
(*build_info)
.mm_data
.mm_multipart
.mm_epilogue,
1i32,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r;
current_block = 16754986508692159943;
} else {
current_block = 7639320476250304355;
}
} else {
current_block = 7639320476250304355;
}
}
}
}
}
}
}
}
}
}
3 => {
if !(*build_info).mm_data.mm_message.mm_fields.is_null() {
r = mailimf_fields_write_driver(
do_write,
data,
col,
(*build_info).mm_data.mm_message.mm_fields,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r;
current_block = 16754986508692159943;
} else {
current_block = 2798392256336243897;
}
} else {
current_block = 2798392256336243897;
}
match current_block {
16754986508692159943 => {}
_ => {
if !(*build_info).mm_mime_fields.is_null() {
let mut r_0: libc::c_int = 0;
let mut cur_0: *mut clistiter = 0 as *mut clistiter;
cur_0 = (*(*(*build_info).mm_mime_fields).fld_list).first;
loop {
if cur_0.is_null() {
current_block = 562309032768341766;
break;
}
let mut field: *mut mailmime_field = 0 as *mut mailmime_field;
field = (*cur_0).data as *mut mailmime_field;
if (*field).fld_type == MAILMIME_FIELD_VERSION as libc::c_int {
r_0 =
mailmime_field_write_driver(do_write, data, col, field);
if r_0 != MAILIMF_NO_ERROR as libc::c_int {
res = r_0;
current_block = 16754986508692159943;
break;
}
}
cur_0 = if !cur_0.is_null() {
(*cur_0).next
} else {
0 as *mut clistcell
}
}
} else {
current_block = 562309032768341766;
}
match current_block {
16754986508692159943 => {}
_ => {
/* encapsuled message */
if !(*build_info).mm_data.mm_message.mm_msg_mime.is_null() {
r = mailmime_sub_write_driver(
do_write,
data,
col,
(*build_info).mm_data.mm_message.mm_msg_mime,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r;
current_block = 16754986508692159943;
} else {
current_block = 7639320476250304355;
}
} else {
current_block = 7639320476250304355;
}
}
}
}
}
}
_ => {
current_block = 7639320476250304355;
}
}
match current_block {
16754986508692159943 => {
free(boundary as *mut libc::c_void);
}
_ => {
free(boundary as *mut libc::c_void);
return MAILIMF_NO_ERROR as libc::c_int;
}
}
}
_ => {}
}
return res;
}
unsafe fn mailmime_sub_write_driver(
mut do_write: Option<
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
>,
mut data: *mut libc::c_void,
mut col: *mut libc::c_int,
mut build_info: *mut Mailmime,
) -> libc::c_int {
let mut r: libc::c_int = 0;
if !(*build_info).mm_content_type.is_null() {
r = mailmime_content_write_driver(do_write, data, col, (*build_info).mm_content_type);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
}
if (*build_info).mm_type != MAILMIME_MESSAGE as libc::c_int {
if !(*build_info).mm_mime_fields.is_null() {
r = mailmime_fields_write_driver(do_write, data, col, (*build_info).mm_mime_fields);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
}
} else if !(*build_info).mm_mime_fields.is_null() {
let mut r_0: libc::c_int = 0;
let mut cur: *mut clistiter = 0 as *mut clistiter;
cur = (*(*(*build_info).mm_mime_fields).fld_list).first;
while !cur.is_null() {
let mut field: *mut mailmime_field = 0 as *mut mailmime_field;
field = (*cur).data as *mut mailmime_field;
if (*field).fld_type != MAILMIME_FIELD_VERSION as libc::c_int {
r_0 = mailmime_field_write_driver(do_write, data, col, field);
if r_0 != MAILIMF_NO_ERROR as libc::c_int {
return r_0;
}
}
cur = if !cur.is_null() {
(*cur).next
} else {
0 as *mut clistcell
}
}
}
r = mailimf_string_write_driver(
do_write,
data,
col,
b"\r\n\x00" as *const u8 as *const libc::c_char,
2i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
return mailmime_part_write_driver(do_write, data, col, build_info);
}
pub unsafe fn mailmime_data_write_driver(
mut do_write: Option<
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
>,
mut data: *mut libc::c_void,
mut col: *mut libc::c_int,
mut mime_data: *mut mailmime_data,
mut istext: libc::c_int,
) -> libc::c_int {
let mut current_block: u64 = 0;
let mut fd: libc::c_int = 0;
let mut r: libc::c_int = 0;
let mut text: *mut libc::c_char = 0 as *mut libc::c_char;
let mut res: libc::c_int = 0;
match (*mime_data).dt_type {
0 => {
if 0 != (*mime_data).dt_encoded {
r = mailimf_string_write_driver(
do_write,
data,
col,
(*mime_data).dt_data.dt_text.dt_data,
(*mime_data).dt_data.dt_text.dt_length,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
} else {
r = mailmime_text_content_write_driver(
do_write,
data,
col,
(*mime_data).dt_encoding,
istext,
(*mime_data).dt_data.dt_text.dt_data,
(*mime_data).dt_data.dt_text.dt_length,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
}
}
1 => {
let filename = CStr::from_ptr((*mime_data).dt_data.dt_filename)
.to_str()
.unwrap();
if let Ok(file) = std::fs::File::open(filename) {
if let Ok(mut text) = memmap::MmapOptions::new().map_copy(&file) {
if 0 != (*mime_data).dt_encoded {
r = mailimf_string_write_driver(
do_write,
data,
col,
text.as_ptr() as *const _,
text.len(),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r;
current_block = 1055471768422549395;
} else {
current_block = 1538046216550696469;
}
} else {
r = mailmime_text_content_write_driver(
do_write,
data,
col,
(*mime_data).dt_encoding,
istext,
text.as_ptr() as *const _,
text.len(),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r;
current_block = 1055471768422549395;
} else {
current_block = 1538046216550696469;
}
}
match current_block {
1055471768422549395 => {
current_block = 5221028069996397600;
}
_ => {
current_block = 9853141518545631134;
}
}
} else {
res = MAILIMF_ERROR_FILE as libc::c_int;
current_block = 5221028069996397600;
}
match current_block {
5221028069996397600 => {}
_ => {
close(fd);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
current_block = 10891380440665537214;
}
}
} else {
res = MAILIMF_ERROR_FILE as libc::c_int;
current_block = 10275258781883576179;
}
match current_block {
10891380440665537214 => {}
_ => {
current_block = 10275258781883576179;
}
}
match current_block {
10891380440665537214 => {}
_ => return res,
}
}
_ => {}
}
return MAILIMF_NO_ERROR as libc::c_int;
}
/* ****************************************************************** */
/* message */
/*
static int mailmime_data_write_driver(int (* do_write)(void *, const char *, size_t), void * data, int * col,
struct mailmime_data * data,
int is_text);
*/
unsafe fn mailmime_text_content_write_driver(
mut do_write: Option<
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
>,
mut data: *mut libc::c_void,
mut col: *mut libc::c_int,
mut encoding: libc::c_int,
mut istext: libc::c_int,
mut text: *const libc::c_char,
mut size: size_t,
) -> libc::c_int {
match encoding {
4 => {
return mailmime_quoted_printable_write_driver(do_write, data, col, istext, text, size)
}
5 => return mailmime_base64_write_driver(do_write, data, col, text, size),
1 | 2 | 3 | _ => return mailimf_string_write_driver(do_write, data, col, text, size),
};
}
pub unsafe fn mailmime_base64_write_driver(
mut do_write: Option<
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
>,
mut data: *mut libc::c_void,
mut col: *mut libc::c_int,
mut text: *const libc::c_char,
mut size: size_t,
) -> libc::c_int {
let mut a: libc::c_int = 0;
let mut b: libc::c_int = 0;
let mut c: libc::c_int = 0;
let mut remains: size_t = 0;
let mut p: *const libc::c_char = 0 as *const libc::c_char;
let mut count: size_t = 0;
let mut ogroup: [libc::c_char; 4] = [0; 4];
let mut r: libc::c_int = 0;
remains = size;
p = text;
while remains > 0i32 as libc::size_t {
match remains {
1 => {
a = *p.offset(0isize) as libc::c_uchar as libc::c_int;
b = 0i32;
c = 0i32;
count = 1i32 as size_t
}
2 => {
a = *p.offset(0isize) as libc::c_uchar as libc::c_int;
b = *p.offset(1isize) as libc::c_uchar as libc::c_int;
c = 0i32;
count = 2i32 as size_t
}
_ => {
a = *p.offset(0isize) as libc::c_uchar as libc::c_int;
b = *p.offset(1isize) as libc::c_uchar as libc::c_int;
c = *p.offset(2isize) as libc::c_uchar as libc::c_int;
count = 3i32 as size_t
}
}
ogroup[0usize] = base64_encoding[(a >> 2i32) as usize];
ogroup[1usize] = base64_encoding[((a & 3i32) << 4i32 | b >> 4i32) as usize];
ogroup[2usize] = base64_encoding[((b & 0xfi32) << 2i32 | c >> 6i32) as usize];
ogroup[3usize] = base64_encoding[(c & 0x3fi32) as usize];
match count {
1 => {
ogroup[2usize] = '=' as i32 as libc::c_char;
ogroup[3usize] = '=' as i32 as libc::c_char
}
2 => ogroup[3usize] = '=' as i32 as libc::c_char,
_ => {}
}
if *col + 4i32 > 76i32 {
r = mailimf_string_write_driver(
do_write,
data,
col,
b"\r\n\x00" as *const u8 as *const libc::c_char,
2i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
}
r = mailimf_string_write_driver(do_write, data, col, ogroup.as_mut_ptr(), 4i32 as size_t);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
remains = (remains as libc::size_t).wrapping_sub(count) as size_t as size_t;
p = p.offset(count as isize)
}
r = mailimf_string_write_driver(
do_write,
data,
col,
b"\r\n\x00" as *const u8 as *const libc::c_char,
2i32 as size_t,
);
return MAILIMF_NO_ERROR as libc::c_int;
}
static mut base64_encoding: [libc::c_char; 65] = [
65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88,
89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114,
115, 116, 117, 118, 119, 120, 121, 122, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 43, 47, 0,
];
pub unsafe fn mailmime_quoted_printable_write_driver(
mut do_write: Option<
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
>,
mut data: *mut libc::c_void,
mut col: *mut libc::c_int,
mut istext: libc::c_int,
mut text: *const libc::c_char,
mut size: size_t,
) -> libc::c_int {
let mut i: size_t = 0;
let mut start: *const libc::c_char = 0 as *const libc::c_char;
let mut len: size_t = 0;
let mut r: libc::c_int = 0;
let mut state: libc::c_int = 0;
start = text;
len = 0i32 as size_t;
state = STATE_INIT as libc::c_int;
i = 0i32 as size_t;
while i < size {
let mut ch: libc::c_uchar = 0;
if (*col as libc::size_t).wrapping_add(len) > 72i32 as libc::size_t {
r = write_remaining(do_write, data, col, &mut start, &mut len);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
start = text.offset(i as isize);
r = mailimf_string_write_driver(
do_write,
data,
col,
b"=\r\n\x00" as *const u8 as *const libc::c_char,
3i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
}
ch = *text.offset(i as isize) as libc::c_uchar;
match state {
0 => {
let mut current_block_50: u64;
match ch as libc::c_int {
32 | 9 => {
state = STATE_SPACE as libc::c_int;
len = len.wrapping_add(1);
i = i.wrapping_add(1);
current_block_50 = 3546145585875536353;
}
13 => {
state = STATE_CR as libc::c_int;
i = i.wrapping_add(1);
current_block_50 = 3546145585875536353;
}
33 | 34 | 35 | 36 | 64 | 91 | 92 | 93 | 94 | 96 | 123 | 124 | 125 | 126
| 61 | 63 | 95 => {
/* there is no more 'From' at the beginning of a line */
current_block_50 = 177397332496894159;
}
70 => {
current_block_50 = 177397332496894159;
}
_ => {
if 0 != istext && ch as libc::c_int == '\n' as i32 {
r = write_remaining(do_write, data, col, &mut start, &mut len);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
start = text.offset(i as isize).offset(1isize);
r = mailimf_string_write_driver(
do_write,
data,
col,
b"\r\n\x00" as *const u8 as *const libc::c_char,
2i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
i = i.wrapping_add(1)
} else if ch as libc::c_int >= 33i32 && ch as libc::c_int <= 60i32
|| ch as libc::c_int >= 62i32 && ch as libc::c_int <= 126i32
{
len = len.wrapping_add(1);
i = i.wrapping_add(1)
} else {
r = write_remaining(do_write, data, col, &mut start, &mut len);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
start = text.offset(i as isize).offset(1isize);
let raw = format!("={:02X}", (ch as libc::c_int));
let raw_c = std::ffi::CString::new(raw).unwrap();
let mut hexstr = strdup(raw_c.as_ptr());
r = mailimf_string_write_driver(
do_write,
data,
col,
hexstr,
3i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
i = i.wrapping_add(1)
}
current_block_50 = 3546145585875536353;
}
}
match current_block_50 {
177397332496894159 => {
r = write_remaining(do_write, data, col, &mut start, &mut len);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
start = text.offset(i as isize).offset(1isize);
let raw = format!("={:02X}", ch as libc::c_int);
let raw_c = std::ffi::CString::new(raw).unwrap();
let mut hexstr = strdup(raw_c.as_ptr());
r = mailimf_string_write_driver(
do_write,
data,
col,
hexstr,
3i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
i = i.wrapping_add(1)
}
_ => {}
}
}
1 => match ch as libc::c_int {
10 => {
r = write_remaining(do_write, data, col, &mut start, &mut len);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
start = text.offset(i as isize).offset(1isize);
r = mailimf_string_write_driver(
do_write,
data,
col,
b"\r\n\x00" as *const u8 as *const libc::c_char,
2i32 as size_t,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
i = i.wrapping_add(1);
state = STATE_INIT as libc::c_int
}
_ => {
r = write_remaining(do_write, data, col, &mut start, &mut len);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
start = text.offset(i as isize);
let raw = format!("={:02X}", b'\r' as i32);
let raw_c = std::ffi::CString::new(raw).unwrap();
let mut hexstr = strdup(raw_c.as_ptr());
r = mailimf_string_write_driver(do_write, data, col, hexstr, 3i32 as size_t);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
state = STATE_INIT as libc::c_int
}
},
2 => match ch as libc::c_int {
13 => {
state = STATE_SPACE_CR as libc::c_int;
i = i.wrapping_add(1)
}
10 => {
r = write_remaining(do_write, data, col, &mut start, &mut len);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
start = text.offset(i as isize).offset(1isize);
let raw = format!(
"={:02X}\r\n",
*text.offset(i.wrapping_sub(1i32 as libc::size_t) as isize) as libc::c_int
);
let raw_c = std::ffi::CString::new(raw).unwrap();
let mut hexstr = strdup(raw_c.as_ptr());
r = mailimf_string_write_driver(do_write, data, col, hexstr, strlen(hexstr));
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
state = STATE_INIT as libc::c_int;
i = i.wrapping_add(1)
}
32 | 9 => {
len = len.wrapping_add(1);
i = i.wrapping_add(1)
}
_ => state = STATE_INIT as libc::c_int,
},
3 => match ch as libc::c_int {
10 => {
r = write_remaining(do_write, data, col, &mut start, &mut len);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
start = text.offset(i as isize).offset(1isize);
let raw = format!(
"={:02X}\r\n",
*text.offset(i.wrapping_sub(2i32 as libc::size_t) as isize) as libc::c_int
);
let raw_c = std::ffi::CString::new(raw).unwrap();
let mut hexstr = strdup(raw_c.as_ptr());
r = mailimf_string_write_driver(do_write, data, col, hexstr, strlen(hexstr));
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
state = STATE_INIT as libc::c_int;
i = i.wrapping_add(1)
}
_ => {
r = write_remaining(do_write, data, col, &mut start, &mut len);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
start = text.offset(i as isize).offset(1isize);
let raw = format!(
"{}={:02X}\r\n",
(*text.offset(i.wrapping_sub(2i32 as libc::size_t) as isize) as u8 as char),
b'\r' as i32
);
let raw_c = std::ffi::CString::new(raw).unwrap();
let mut hexstr = strdup(raw_c.as_ptr());
r = mailimf_string_write_driver(do_write, data, col, hexstr, strlen(hexstr));
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
state = STATE_INIT as libc::c_int
}
},
_ => {}
}
}
r = write_remaining(do_write, data, col, &mut start, &mut len);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
return MAILIMF_NO_ERROR as libc::c_int;
}
#[inline]
unsafe fn write_remaining(
mut do_write: Option<
unsafe fn(_: *mut libc::c_void, _: *const libc::c_char, _: size_t) -> libc::c_int,
>,
mut data: *mut libc::c_void,
mut col: *mut libc::c_int,
mut pstart: *mut *const libc::c_char,
mut plen: *mut size_t,
) -> libc::c_int {
let mut r: libc::c_int = 0;
if *plen > 0i32 as libc::size_t {
r = mailimf_string_write_driver(do_write, data, col, *pstart, *plen);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
*plen = 0i32 as size_t
}
return MAILIMF_NO_ERROR as libc::c_int;
}