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

5922 lines
208 KiB
Rust

pub mod types;
pub mod types_helper;
pub(crate) mod write_generic;
use libc::{self, toupper};
use crate::clist::*;
use crate::mailimf::types::*;
use crate::mailmime::decode::*;
use crate::mailmime::types::*;
use crate::mmapstring::*;
use crate::other::*;
pub const UNSTRUCTURED_START: libc::c_uint = 0;
pub const UNSTRUCTURED_LF: libc::c_uint = 2;
pub const UNSTRUCTURED_CR: libc::c_uint = 1;
pub const UNSTRUCTURED_WSP: libc::c_uint = 3;
pub const UNSTRUCTURED_OUT: libc::c_uint = 4;
pub const STATE_ZONE_ERR: libc::c_uint = 4;
pub const STATE_ZONE_OK: libc::c_uint = 3;
pub const STATE_ZONE_3: libc::c_uint = 2;
pub const STATE_ZONE_2: libc::c_uint = 1;
pub const STATE_ZONE_CONT: libc::c_uint = 5;
pub const STATE_ZONE_1: libc::c_uint = 0;
pub const MONTH_A: libc::c_uint = 5;
pub const MONTH_MA: libc::c_uint = 4;
pub const MONTH_M: libc::c_uint = 3;
pub const MONTH_JU: libc::c_uint = 2;
pub const MONTH_J: libc::c_uint = 1;
pub const MONTH_START: libc::c_uint = 0;
pub const DAY_NAME_S: libc::c_uint = 2;
pub const DAY_NAME_T: libc::c_uint = 1;
pub const DAY_NAME_START: libc::c_uint = 0;
pub const HEADER_RES: libc::c_uint = 5;
pub const HEADER_S: libc::c_uint = 4;
pub const HEADER_RE: libc::c_uint = 3;
pub const HEADER_R: libc::c_uint = 2;
pub const HEADER_C: libc::c_uint = 1;
pub const HEADER_START: libc::c_uint = 0;
/*
day-name = "Mon" / "Tue" / "Wed" / "Thu" /
"Fri" / "Sat" / "Sun"
*/
#[derive(Copy, Clone)]
#[repr(C)]
pub struct mailimf_token_value {
pub value: libc::c_int,
pub str_0: *mut libc::c_char,
}
/*
mailimf_message_parse will parse the given message
@param message this is a string containing the message content
@param length this is the size of the given string
@param indx this is a pointer to the start of the message in
the given string, (* indx) is modified to point at the end
of the parsed data
@param result the result of the parse operation is stored in
(* result)
@return MAILIMF_NO_ERROR on success, MAILIMF_ERROR_XXX on error
*/
pub unsafe fn mailimf_message_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_message,
) -> libc::c_int {
let mut fields: *mut mailimf_fields = 0 as *mut mailimf_fields;
let mut body: *mut mailimf_body = 0 as *mut mailimf_body;
let mut msg: *mut mailimf_message = 0 as *mut mailimf_message;
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
r = mailimf_fields_parse(message, length, &mut cur_token, &mut fields);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_crlf_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int && r != MAILIMF_ERROR_PARSE as libc::c_int {
res = r
} else {
r = mailimf_body_parse(message, length, &mut cur_token, &mut body);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
msg = mailimf_message_new(fields, body);
if msg.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int;
mailimf_body_free(body);
} else {
*indx = cur_token;
*result = msg;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
mailimf_fields_free(fields);
}
}
return res;
}
/*
mailimf_body_parse will parse the given text part of a message
@param message this is a string containing the message text part
@param length this is the size of the given string
@param indx this is a pointer to the start of the message text part in
the given string, (* indx) is modified to point at the end
of the parsed data
@param result the result of the parse operation is stored in
(* result)
@return MAILIMF_NO_ERROR on success, MAILIMF_ERROR_XXX on error
*/
pub unsafe fn mailimf_body_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_body,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut body: *mut mailimf_body = 0 as *mut mailimf_body;
cur_token = *indx;
body = mailimf_body_new(
message.offset(cur_token as isize),
length.wrapping_sub(cur_token),
);
if body.is_null() {
return MAILIMF_ERROR_MEMORY as libc::c_int;
}
cur_token = length;
*result = body;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
pub unsafe fn mailimf_crlf_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
cur_token = *indx;
r = mailimf_char_parse(message, length, &mut cur_token, '\r' as i32 as libc::c_char);
if r != MAILIMF_NO_ERROR as libc::c_int && r != MAILIMF_ERROR_PARSE as libc::c_int {
return r;
}
r = mailimf_char_parse(message, length, &mut cur_token, '\n' as i32 as libc::c_char);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
pub unsafe fn mailimf_char_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut token: libc::c_char,
) -> libc::c_int {
let mut cur_token: size_t = 0;
cur_token = *indx;
if cur_token >= length {
return MAILIMF_ERROR_PARSE as libc::c_int;
}
if *message.offset(cur_token as isize) as libc::c_int == token as libc::c_int {
cur_token = cur_token.wrapping_add(1);
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
} else {
return MAILIMF_ERROR_PARSE as libc::c_int;
};
}
/*
mailimf_fields_parse will parse the given header fields
@param message this is a string containing the header fields
@param length this is the size of the given string
@param indx this is a pointer to the start of the header fields in
the given string, (* indx) is modified to point at the end
of the parsed data
@param result the result of the parse operation is stored in
(* result)
@return MAILIMF_NO_ERROR on success, MAILIMF_ERROR_XXX on error
*/
pub unsafe fn mailimf_fields_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_fields,
) -> libc::c_int {
let mut current_block: u64;
let mut cur_token: size_t = 0;
let mut list: *mut clist = 0 as *mut clist;
let mut fields: *mut mailimf_fields = 0 as *mut mailimf_fields;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
list = 0 as *mut clist;
r = mailimf_struct_multiple_parse(
message,
length,
&mut cur_token,
&mut list,
::std::mem::transmute::<
Option<
unsafe fn(
_: *const libc::c_char,
_: size_t,
_: *mut size_t,
_: *mut *mut mailimf_field,
) -> libc::c_int,
>,
Option<
unsafe fn(
_: *const libc::c_char,
_: size_t,
_: *mut size_t,
_: *mut libc::c_void,
) -> libc::c_int,
>,
>(Some(mailimf_field_parse)),
::std::mem::transmute::<
Option<unsafe fn(_: *mut mailimf_field) -> ()>,
Option<unsafe fn(_: *mut libc::c_void) -> libc::c_int>,
>(Some(mailimf_field_free)),
);
/*
if ((r != MAILIMF_NO_ERROR) && (r != MAILIMF_ERROR_PARSE)) {
res = r;
goto err;
}
*/
match r {
0 => {
/* do nothing */
current_block = 11050875288958768710;
}
1 => {
list = clist_new();
if list.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int;
current_block = 6724962012950341805;
} else {
current_block = 11050875288958768710;
}
}
_ => {
res = r;
current_block = 6724962012950341805;
}
}
match current_block {
11050875288958768710 => {
fields = mailimf_fields_new(list);
if fields.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int;
if !list.is_null() {
clist_foreach(
list,
::std::mem::transmute::<
Option<unsafe fn(_: *mut mailimf_field) -> ()>,
clist_func,
>(Some(mailimf_field_free)),
0 as *mut libc::c_void,
);
clist_free(list);
}
} else {
*result = fields;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
_ => {}
}
return res;
}
unsafe fn mailimf_field_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_field,
) -> libc::c_int {
let mut current_block: u64;
let mut cur_token: size_t = 0;
let mut type_0: libc::c_int = 0;
let mut return_path: *mut mailimf_return = 0 as *mut mailimf_return;
let mut resent_date: *mut mailimf_orig_date = 0 as *mut mailimf_orig_date;
let mut resent_from: *mut mailimf_from = 0 as *mut mailimf_from;
let mut resent_sender: *mut mailimf_sender = 0 as *mut mailimf_sender;
let mut resent_to: *mut mailimf_to = 0 as *mut mailimf_to;
let mut resent_cc: *mut mailimf_cc = 0 as *mut mailimf_cc;
let mut resent_bcc: *mut mailimf_bcc = 0 as *mut mailimf_bcc;
let mut resent_msg_id: *mut mailimf_message_id = 0 as *mut mailimf_message_id;
let mut orig_date: *mut mailimf_orig_date = 0 as *mut mailimf_orig_date;
let mut from: *mut mailimf_from = 0 as *mut mailimf_from;
let mut sender: *mut mailimf_sender = 0 as *mut mailimf_sender;
let mut reply_to: *mut mailimf_reply_to = 0 as *mut mailimf_reply_to;
let mut to: *mut mailimf_to = 0 as *mut mailimf_to;
let mut cc: *mut mailimf_cc = 0 as *mut mailimf_cc;
let mut bcc: *mut mailimf_bcc = 0 as *mut mailimf_bcc;
let mut message_id: *mut mailimf_message_id = 0 as *mut mailimf_message_id;
let mut in_reply_to: *mut mailimf_in_reply_to = 0 as *mut mailimf_in_reply_to;
let mut references: *mut mailimf_references = 0 as *mut mailimf_references;
let mut subject: *mut mailimf_subject = 0 as *mut mailimf_subject;
let mut comments: *mut mailimf_comments = 0 as *mut mailimf_comments;
let mut keywords: *mut mailimf_keywords = 0 as *mut mailimf_keywords;
let mut optional_field: *mut mailimf_optional_field = 0 as *mut mailimf_optional_field;
let mut field: *mut mailimf_field = 0 as *mut mailimf_field;
let mut guessed_type: libc::c_int = 0;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
return_path = 0 as *mut mailimf_return;
resent_date = 0 as *mut mailimf_orig_date;
resent_from = 0 as *mut mailimf_from;
resent_sender = 0 as *mut mailimf_sender;
resent_to = 0 as *mut mailimf_to;
resent_cc = 0 as *mut mailimf_cc;
resent_bcc = 0 as *mut mailimf_bcc;
resent_msg_id = 0 as *mut mailimf_message_id;
orig_date = 0 as *mut mailimf_orig_date;
from = 0 as *mut mailimf_from;
sender = 0 as *mut mailimf_sender;
reply_to = 0 as *mut mailimf_reply_to;
to = 0 as *mut mailimf_to;
cc = 0 as *mut mailimf_cc;
bcc = 0 as *mut mailimf_bcc;
message_id = 0 as *mut mailimf_message_id;
in_reply_to = 0 as *mut mailimf_in_reply_to;
references = 0 as *mut mailimf_references;
subject = 0 as *mut mailimf_subject;
comments = 0 as *mut mailimf_comments;
keywords = 0 as *mut mailimf_keywords;
optional_field = 0 as *mut mailimf_optional_field;
guessed_type = guess_header_type(message, length, cur_token);
type_0 = MAILIMF_FIELD_NONE as libc::c_int;
match guessed_type {
9 => {
r = mailimf_orig_date_parse(message, length, &mut cur_token, &mut orig_date);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = MAILIMF_FIELD_ORIG_DATE as libc::c_int;
current_block = 9846950269610550213;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 9846950269610550213;
} else {
/* do nothing */
res = r;
current_block = 10956553358380301606;
}
}
10 => {
r = mailimf_from_parse(message, length, &mut cur_token, &mut from);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 9846950269610550213;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 9846950269610550213;
} else {
/* do nothing */
res = r;
current_block = 10956553358380301606;
}
}
11 => {
r = mailimf_sender_parse(message, length, &mut cur_token, &mut sender);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 9846950269610550213;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 9846950269610550213;
} else {
/* do nothing */
res = r;
current_block = 10956553358380301606;
}
}
12 => {
r = mailimf_reply_to_parse(message, length, &mut cur_token, &mut reply_to);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 9846950269610550213;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 9846950269610550213;
} else {
/* do nothing */
res = r;
current_block = 10956553358380301606;
}
}
13 => {
r = mailimf_to_parse(message, length, &mut cur_token, &mut to);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 9846950269610550213;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 9846950269610550213;
} else {
/* do nothing */
res = r;
current_block = 10956553358380301606;
}
}
14 => {
r = mailimf_cc_parse(message, length, &mut cur_token, &mut cc);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 9846950269610550213;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 9846950269610550213;
} else {
/* do nothing */
res = r;
current_block = 10956553358380301606;
}
}
15 => {
r = mailimf_bcc_parse(message, length, &mut cur_token, &mut bcc);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 9846950269610550213;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 9846950269610550213;
} else {
/* do nothing */
res = r;
current_block = 10956553358380301606;
}
}
16 => {
r = mailimf_message_id_parse(message, length, &mut cur_token, &mut message_id);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 9846950269610550213;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 9846950269610550213;
} else {
/* do nothing */
res = r;
current_block = 10956553358380301606;
}
}
17 => {
r = mailimf_in_reply_to_parse(message, length, &mut cur_token, &mut in_reply_to);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 9846950269610550213;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 9846950269610550213;
} else {
/* do nothing */
res = r;
current_block = 10956553358380301606;
}
}
18 => {
r = mailimf_references_parse(message, length, &mut cur_token, &mut references);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 9846950269610550213;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 9846950269610550213;
} else {
/* do nothing */
res = r;
current_block = 10956553358380301606;
}
}
19 => {
r = mailimf_subject_parse(message, length, &mut cur_token, &mut subject);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 9846950269610550213;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 9846950269610550213;
} else {
/* do nothing */
res = r;
current_block = 10956553358380301606;
}
}
20 => {
r = mailimf_comments_parse(message, length, &mut cur_token, &mut comments);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 9846950269610550213;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 9846950269610550213;
} else {
/* do nothing */
res = r;
current_block = 10956553358380301606;
}
}
21 => {
r = mailimf_keywords_parse(message, length, &mut cur_token, &mut keywords);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 9846950269610550213;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 9846950269610550213;
} else {
/* do nothing */
res = r;
current_block = 10956553358380301606;
}
}
1 => {
r = mailimf_return_parse(message, length, &mut cur_token, &mut return_path);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 9846950269610550213;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 9846950269610550213;
} else {
/* do nothing */
res = r;
current_block = 10956553358380301606;
}
}
2 => {
r = mailimf_resent_date_parse(message, length, &mut cur_token, &mut resent_date);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 9846950269610550213;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 9846950269610550213;
} else {
/* do nothing */
res = r;
current_block = 10956553358380301606;
}
}
3 => {
r = mailimf_resent_from_parse(message, length, &mut cur_token, &mut resent_from);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 9846950269610550213;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 9846950269610550213;
} else {
/* do nothing */
res = r;
current_block = 10956553358380301606;
}
}
4 => {
r = mailimf_resent_sender_parse(message, length, &mut cur_token, &mut resent_sender);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 9846950269610550213;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 9846950269610550213;
} else {
/* do nothing */
res = r;
current_block = 10956553358380301606;
}
}
5 => {
r = mailimf_resent_to_parse(message, length, &mut cur_token, &mut resent_to);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 9846950269610550213;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 9846950269610550213;
} else {
/* do nothing */
res = r;
current_block = 10956553358380301606;
}
}
6 => {
r = mailimf_resent_cc_parse(message, length, &mut cur_token, &mut resent_cc);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 9846950269610550213;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 9846950269610550213;
} else {
/* do nothing */
res = r;
current_block = 10956553358380301606;
}
}
7 => {
r = mailimf_resent_bcc_parse(message, length, &mut cur_token, &mut resent_bcc);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 9846950269610550213;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 9846950269610550213;
} else {
/* do nothing */
res = r;
current_block = 10956553358380301606;
}
}
8 => {
r = mailimf_resent_msg_id_parse(message, length, &mut cur_token, &mut resent_msg_id);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 9846950269610550213;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 9846950269610550213;
} else {
/* do nothing */
res = r;
current_block = 10956553358380301606;
}
}
_ => {
current_block = 9846950269610550213;
}
}
match current_block {
9846950269610550213 => {
if type_0 == MAILIMF_FIELD_NONE as libc::c_int {
r = mailimf_optional_field_parse(
message,
length,
&mut cur_token,
&mut optional_field,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r;
current_block = 10956553358380301606;
} else {
type_0 = MAILIMF_FIELD_OPTIONAL_FIELD as libc::c_int;
current_block = 2920409193602730479;
}
} else {
current_block = 2920409193602730479;
}
match current_block {
10956553358380301606 => {}
_ => {
field = mailimf_field_new(
type_0,
return_path,
resent_date,
resent_from,
resent_sender,
resent_to,
resent_cc,
resent_bcc,
resent_msg_id,
orig_date,
from,
sender,
reply_to,
to,
cc,
bcc,
message_id,
in_reply_to,
references,
subject,
comments,
keywords,
optional_field,
);
if field.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int;
if !return_path.is_null() {
mailimf_return_free(return_path);
}
if !resent_date.is_null() {
mailimf_orig_date_free(resent_date);
}
if !resent_from.is_null() {
mailimf_from_free(resent_from);
}
if !resent_sender.is_null() {
mailimf_sender_free(resent_sender);
}
if !resent_to.is_null() {
mailimf_to_free(resent_to);
}
if !resent_cc.is_null() {
mailimf_cc_free(resent_cc);
}
if !resent_bcc.is_null() {
mailimf_bcc_free(resent_bcc);
}
if !resent_msg_id.is_null() {
mailimf_message_id_free(resent_msg_id);
}
if !orig_date.is_null() {
mailimf_orig_date_free(orig_date);
}
if !from.is_null() {
mailimf_from_free(from);
}
if !sender.is_null() {
mailimf_sender_free(sender);
}
if !reply_to.is_null() {
mailimf_reply_to_free(reply_to);
}
if !to.is_null() {
mailimf_to_free(to);
}
if !cc.is_null() {
mailimf_cc_free(cc);
}
if !bcc.is_null() {
mailimf_bcc_free(bcc);
}
if !message_id.is_null() {
mailimf_message_id_free(message_id);
}
if !in_reply_to.is_null() {
mailimf_in_reply_to_free(in_reply_to);
}
if !references.is_null() {
mailimf_references_free(references);
}
if !subject.is_null() {
mailimf_subject_free(subject);
}
if !comments.is_null() {
mailimf_comments_free(comments);
}
if !keywords.is_null() {
mailimf_keywords_free(keywords);
}
if !optional_field.is_null() {
mailimf_optional_field_free(optional_field);
}
} else {
*result = field;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
}
}
_ => {}
}
return res;
}
unsafe fn mailimf_optional_field_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_optional_field,
) -> libc::c_int {
let mut name: *mut libc::c_char = 0 as *mut libc::c_char;
let mut value: *mut libc::c_char = 0 as *mut libc::c_char;
let mut optional_field: *mut mailimf_optional_field = 0 as *mut mailimf_optional_field;
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
r = mailimf_field_name_parse(message, length, &mut cur_token, &mut name);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_colon_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_unstructured_parse(message, length, &mut cur_token, &mut value);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_unstrict_crlf_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
optional_field = mailimf_optional_field_new(name, value);
if optional_field.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
*result = optional_field;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
mailimf_unstructured_free(value);
}
}
mailimf_field_name_free(name);
}
return res;
}
unsafe fn mailimf_unstrict_crlf_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
cur_token = *indx;
mailimf_cfws_parse(message, length, &mut cur_token);
r = mailimf_char_parse(message, length, &mut cur_token, '\r' as i32 as libc::c_char);
if r != MAILIMF_NO_ERROR as libc::c_int && r != MAILIMF_ERROR_PARSE as libc::c_int {
return r;
}
r = mailimf_char_parse(message, length, &mut cur_token, '\n' as i32 as libc::c_char);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
pub unsafe fn mailimf_cfws_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut has_comment: libc::c_int = 0;
let mut r: libc::c_int = 0;
cur_token = *indx;
has_comment = 0i32;
loop {
r = mailimf_cfws_fws_comment_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
if r == MAILIMF_ERROR_PARSE as libc::c_int {
break;
}
return r;
} else {
has_comment = 1i32
}
}
if 0 == has_comment {
r = mailimf_fws_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
}
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
/* internal use, exported for MIME */
pub unsafe fn mailimf_fws_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut final_token: size_t = 0;
let mut fws_1: libc::c_int = 0;
let mut fws_2: libc::c_int = 0;
let mut fws_3: libc::c_int = 0;
let mut r: libc::c_int = 0;
cur_token = *indx;
fws_1 = 0i32;
loop {
r = mailimf_wsp_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
if r == MAILIMF_ERROR_PARSE as libc::c_int {
break;
}
return r;
} else {
fws_1 = 1i32
}
}
final_token = cur_token;
r = mailimf_crlf_parse(message, length, &mut cur_token);
match r {
0 => fws_2 = 1i32,
1 => fws_2 = 0i32,
_ => return r,
}
fws_3 = 0i32;
if 0 != fws_2 {
loop {
r = mailimf_wsp_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
if r == MAILIMF_ERROR_PARSE as libc::c_int {
break;
}
return r;
} else {
fws_3 = 1i32
}
}
}
if 0 == fws_1 && 0 == fws_3 {
return MAILIMF_ERROR_PARSE as libc::c_int;
}
if 0 == fws_3 {
cur_token = final_token
}
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
#[inline]
unsafe fn mailimf_wsp_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
) -> libc::c_int {
let mut cur_token: size_t = 0;
cur_token = *indx;
if cur_token >= length {
return MAILIMF_ERROR_PARSE as libc::c_int;
}
if *message.offset(cur_token as isize) as libc::c_int != ' ' as i32
&& *message.offset(cur_token as isize) as libc::c_int != '\t' as i32
{
return MAILIMF_ERROR_PARSE as libc::c_int;
}
cur_token = cur_token.wrapping_add(1);
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
/*
[FWS] comment
*/
#[inline]
unsafe fn mailimf_cfws_fws_comment_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
cur_token = *indx;
r = mailimf_fws_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int && r != MAILIMF_ERROR_PARSE as libc::c_int {
return r;
}
r = mailimf_comment_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
#[inline]
unsafe fn mailimf_comment_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
cur_token = *indx;
r = mailimf_oparenth_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
loop {
r = mailimf_comment_fws_ccontent_parse(message, length, &mut cur_token);
if !(r != MAILIMF_NO_ERROR as libc::c_int) {
continue;
}
if r == MAILIMF_ERROR_PARSE as libc::c_int {
break;
}
return r;
}
r = mailimf_fws_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int && r != MAILIMF_ERROR_PARSE as libc::c_int {
return r;
}
r = mailimf_cparenth_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailimf_cparenth_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
) -> libc::c_int {
return mailimf_char_parse(message, length, indx, ')' as i32 as libc::c_char);
}
#[inline]
unsafe fn mailimf_comment_fws_ccontent_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
cur_token = *indx;
r = mailimf_fws_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int && r != MAILIMF_ERROR_PARSE as libc::c_int {
return r;
}
r = mailimf_ccontent_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
#[inline]
unsafe fn mailimf_ccontent_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut ch: libc::c_char = 0;
let mut r: libc::c_int = 0;
cur_token = *indx;
if cur_token >= length {
return MAILIMF_ERROR_PARSE as libc::c_int;
}
if 0 != is_ctext(*message.offset(cur_token as isize)) {
cur_token = cur_token.wrapping_add(1)
} else {
r = mailimf_quoted_pair_parse(message, length, &mut cur_token, &mut ch);
if r == MAILIMF_ERROR_PARSE as libc::c_int {
r = mailimf_comment_parse(message, length, &mut cur_token)
}
if r == MAILIMF_ERROR_PARSE as libc::c_int {
return r;
}
}
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
#[inline]
unsafe fn mailimf_quoted_pair_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut libc::c_char,
) -> libc::c_int {
let mut cur_token: size_t = 0;
cur_token = *indx;
if cur_token.wrapping_add(1i32 as libc::size_t) >= length {
return MAILIMF_ERROR_PARSE as libc::c_int;
}
if *message.offset(cur_token as isize) as libc::c_int != '\\' as i32 {
return MAILIMF_ERROR_PARSE as libc::c_int;
}
cur_token = cur_token.wrapping_add(1);
*result = *message.offset(cur_token as isize);
cur_token = cur_token.wrapping_add(1);
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
/*
ctext = NO-WS-CTL / ; Non white space controls
%d33-39 / ; The rest of the US-ASCII
%d42-91 / ; characters not including "(",
%d93-126 ; ")", or "\"
*/
#[inline]
unsafe fn is_ctext(mut ch: libc::c_char) -> libc::c_int {
let mut uch: libc::c_uchar = ch as libc::c_uchar;
if 0 != is_no_ws_ctl(ch) {
return 1i32;
}
if (uch as libc::c_int) < 33i32 {
return 0i32;
}
if uch as libc::c_int == 40i32 || uch as libc::c_int == 41i32 {
return 0i32;
}
if uch as libc::c_int == 92i32 {
return 0i32;
}
if uch as libc::c_int == 127i32 {
return 0i32;
}
return 1i32;
}
/* ************************************************************************ */
/* RFC 2822 grammar */
/*
NO-WS-CTL = %d1-8 / ; US-ASCII control characters
%d11 / ; that do not include the
%d12 / ; carriage return, line feed,
%d14-31 / ; and white space characters
%d127
*/
#[inline]
unsafe fn is_no_ws_ctl(mut ch: libc::c_char) -> libc::c_int {
if ch as libc::c_int == 9i32 || ch as libc::c_int == 10i32 || ch as libc::c_int == 13i32 {
return 0i32;
}
if ch as libc::c_int == 127i32 {
return 1i32;
}
return (ch as libc::c_int >= 1i32 && ch as libc::c_int <= 31i32) as libc::c_int;
}
unsafe fn mailimf_oparenth_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
) -> libc::c_int {
return mailimf_char_parse(message, length, indx, '(' as i32 as libc::c_char);
}
unsafe fn mailimf_unstructured_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut libc::c_char,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut state: libc::c_int = 0;
let mut begin: size_t = 0;
let mut terminal: size_t = 0;
let mut str: *mut libc::c_char = 0 as *mut libc::c_char;
cur_token = *indx;
loop {
let mut r: libc::c_int = 0;
r = mailimf_wsp_parse(message, length, &mut cur_token);
if r == MAILIMF_NO_ERROR as libc::c_int {
continue;
}
/* do nothing */
if r == MAILIMF_ERROR_PARSE as libc::c_int {
break;
}
return r;
}
state = UNSTRUCTURED_START as libc::c_int;
begin = cur_token;
terminal = cur_token;
while state != UNSTRUCTURED_OUT as libc::c_int {
match state {
0 => {
if cur_token >= length {
return MAILIMF_ERROR_PARSE as libc::c_int;
}
terminal = cur_token;
match *message.offset(cur_token as isize) as libc::c_int {
13 => state = UNSTRUCTURED_CR as libc::c_int,
10 => state = UNSTRUCTURED_LF as libc::c_int,
_ => state = UNSTRUCTURED_START as libc::c_int,
}
}
1 => {
if cur_token >= length {
return MAILIMF_ERROR_PARSE as libc::c_int;
}
match *message.offset(cur_token as isize) as libc::c_int {
10 => state = UNSTRUCTURED_LF as libc::c_int,
_ => state = UNSTRUCTURED_START as libc::c_int,
}
}
2 => {
if cur_token >= length {
state = UNSTRUCTURED_OUT as libc::c_int
} else {
match *message.offset(cur_token as isize) as libc::c_int {
9 | 32 => state = UNSTRUCTURED_WSP as libc::c_int,
_ => state = UNSTRUCTURED_OUT as libc::c_int,
}
}
}
3 => {
if cur_token >= length {
return MAILIMF_ERROR_PARSE as libc::c_int;
}
match *message.offset(cur_token as isize) as libc::c_int {
13 => state = UNSTRUCTURED_CR as libc::c_int,
10 => state = UNSTRUCTURED_LF as libc::c_int,
_ => state = UNSTRUCTURED_START as libc::c_int,
}
}
_ => {}
}
cur_token = cur_token.wrapping_add(1)
}
str = malloc(
terminal
.wrapping_sub(begin)
.wrapping_add(1i32 as libc::size_t),
) as *mut libc::c_char;
if str.is_null() {
return MAILIMF_ERROR_MEMORY as libc::c_int;
}
strncpy(
str,
message.offset(begin as isize),
terminal.wrapping_sub(begin),
);
*str.offset(terminal.wrapping_sub(begin) as isize) = '\u{0}' as i32 as libc::c_char;
*indx = terminal;
*result = str;
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailimf_colon_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
) -> libc::c_int {
return mailimf_unstrict_char_parse(message, length, indx, ':' as i32 as libc::c_char);
}
pub unsafe fn mailimf_unstrict_char_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut token: libc::c_char,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
cur_token = *indx;
r = mailimf_cfws_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int && r != MAILIMF_ERROR_PARSE as libc::c_int {
return r;
}
r = mailimf_char_parse(message, length, &mut cur_token, token);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailimf_field_name_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut libc::c_char,
) -> libc::c_int {
let mut field_name: *mut libc::c_char = 0 as *mut libc::c_char;
let mut cur_token: size_t = 0;
let mut end: size_t = 0;
cur_token = *indx;
end = cur_token;
if end >= length {
return MAILIMF_ERROR_PARSE as libc::c_int;
}
while 0 != is_ftext(*message.offset(end as isize)) {
end = end.wrapping_add(1);
if end >= length {
break;
}
}
if end == cur_token {
return MAILIMF_ERROR_PARSE as libc::c_int;
}
field_name = malloc(
end.wrapping_sub(cur_token)
.wrapping_add(1i32 as libc::size_t),
) as *mut libc::c_char;
if field_name.is_null() {
return MAILIMF_ERROR_MEMORY as libc::c_int;
}
strncpy(
field_name,
message.offset(cur_token as isize),
end.wrapping_sub(cur_token),
);
*field_name.offset(end.wrapping_sub(cur_token) as isize) = '\u{0}' as i32 as libc::c_char;
cur_token = end;
*indx = cur_token;
*result = field_name;
return MAILIMF_NO_ERROR as libc::c_int;
}
/*
field-name = 1*ftext
*/
#[inline]
unsafe fn is_ftext(mut ch: libc::c_char) -> libc::c_int {
let mut uch: libc::c_uchar = ch as libc::c_uchar;
if (uch as libc::c_int) < 33i32 {
return 0i32;
}
if uch as libc::c_int == 58i32 {
return 0i32;
}
return 1i32;
}
unsafe fn mailimf_resent_msg_id_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_message_id,
) -> libc::c_int {
let mut value: *mut libc::c_char = 0 as *mut libc::c_char;
let mut cur_token: size_t = 0;
let mut message_id: *mut mailimf_message_id = 0 as *mut mailimf_message_id;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
r = mailimf_token_case_insensitive_len_parse(
message,
length,
&mut cur_token,
b"Resent-Message-ID\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
strlen(b"Resent-Message-ID\x00" as *const u8 as *const libc::c_char),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_colon_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_msg_id_parse(message, length, &mut cur_token, &mut value);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_unstrict_crlf_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
message_id = mailimf_message_id_new(value);
if message_id.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
*result = message_id;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
mailimf_msg_id_free(value);
}
}
}
return res;
}
pub unsafe fn mailimf_msg_id_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut libc::c_char,
) -> libc::c_int {
let mut current_block: u64;
let mut cur_token: size_t = 0;
let mut msg_id: *mut libc::c_char = 0 as *mut libc::c_char;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
r = mailimf_cfws_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int && r != MAILIMF_ERROR_PARSE as libc::c_int {
return r;
}
r = mailimf_lower_parse(message, length, &mut cur_token);
if r == MAILIMF_ERROR_PARSE as libc::c_int {
r = mailimf_addr_spec_msg_id_parse(message, length, &mut cur_token, &mut msg_id);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
*result = msg_id;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
} else if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_lower_parse(message, length, &mut cur_token);
if r == MAILIMF_NO_ERROR as libc::c_int {
current_block = 2668756484064249700;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 2668756484064249700;
} else {
// ok
res = r;
current_block = 9394595304415473402;
}
match current_block {
9394595304415473402 => {}
_ => {
r = mailimf_addr_spec_msg_id_parse(message, length, &mut cur_token, &mut msg_id);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_greater_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
free(msg_id as *mut libc::c_void);
res = r
} else {
r = mailimf_greater_parse(message, length, &mut cur_token);
if r == MAILIMF_NO_ERROR as libc::c_int
|| r == MAILIMF_ERROR_PARSE as libc::c_int
{
current_block = 6450636197030046351;
} else {
// ok
free(msg_id as *mut libc::c_void);
res = r;
current_block = 9394595304415473402;
}
match current_block {
9394595304415473402 => {}
_ => {
*result = msg_id;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
}
}
}
}
}
return res;
}
unsafe fn mailimf_greater_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
) -> libc::c_int {
return mailimf_unstrict_char_parse(message, length, indx, '>' as i32 as libc::c_char);
}
/*
for msg id
addr-spec = local-part "@" domain
*/
unsafe fn mailimf_addr_spec_msg_id_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut libc::c_char,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut addr_spec: *mut libc::c_char = 0 as *mut libc::c_char;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
let mut begin: size_t = 0;
let mut end: size_t = 0;
let mut final_0: libc::c_int = 0;
let mut count: size_t = 0;
let mut src: *const libc::c_char = 0 as *const libc::c_char;
let mut dest: *mut libc::c_char = 0 as *mut libc::c_char;
let mut i: size_t = 0;
cur_token = *indx;
r = mailimf_cfws_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int && r != MAILIMF_ERROR_PARSE as libc::c_int {
res = r
} else {
end = cur_token;
if end >= length {
res = MAILIMF_ERROR_PARSE as libc::c_int
} else {
begin = cur_token;
final_0 = 0i32;
loop {
match *message.offset(end as isize) as libc::c_int {
62 | 13 | 10 => final_0 = 1i32,
_ => {}
}
if 0 != final_0 {
break;
}
end = end.wrapping_add(1);
if end >= length {
break;
}
}
if end == begin {
res = MAILIMF_ERROR_PARSE as libc::c_int
} else {
addr_spec = malloc(
end.wrapping_sub(cur_token)
.wrapping_add(1i32 as libc::size_t),
) as *mut libc::c_char;
if addr_spec.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
count = end.wrapping_sub(cur_token);
src = message.offset(cur_token as isize);
dest = addr_spec;
i = 0i32 as size_t;
while i < count {
if *src as libc::c_int != ' ' as i32 && *src as libc::c_int != '\t' as i32 {
*dest = *src;
dest = dest.offset(1isize)
}
src = src.offset(1isize);
i = i.wrapping_add(1)
}
*dest = '\u{0}' as i32 as libc::c_char;
cur_token = end;
*result = addr_spec;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
}
}
return res;
}
unsafe fn mailimf_lower_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
) -> libc::c_int {
return mailimf_unstrict_char_parse(message, length, indx, '<' as i32 as libc::c_char);
}
pub unsafe fn mailimf_token_case_insensitive_len_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut token: *mut libc::c_char,
mut token_length: size_t,
) -> libc::c_int {
let mut cur_token: size_t = 0;
cur_token = *indx;
if cur_token
.wrapping_add(token_length)
.wrapping_sub(1i32 as libc::size_t)
>= length
{
return MAILIMF_ERROR_PARSE as libc::c_int;
}
if strncasecmp(message.offset(cur_token as isize), token, token_length) == 0i32 {
cur_token = (cur_token as libc::size_t).wrapping_add(token_length) as size_t as size_t;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
} else {
return MAILIMF_ERROR_PARSE as libc::c_int;
};
}
unsafe fn mailimf_resent_bcc_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_bcc,
) -> libc::c_int {
let mut addr_list: *mut mailimf_address_list = 0 as *mut mailimf_address_list;
let mut bcc: *mut mailimf_bcc = 0 as *mut mailimf_bcc;
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
bcc = 0 as *mut mailimf_bcc;
r = mailimf_token_case_insensitive_len_parse(
message,
length,
&mut cur_token,
b"Resent-Bcc\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
strlen(b"Resent-Bcc\x00" as *const u8 as *const libc::c_char),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_colon_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
addr_list = 0 as *mut mailimf_address_list;
r = mailimf_address_list_parse(message, length, &mut cur_token, &mut addr_list);
if r != MAILIMF_NO_ERROR as libc::c_int && r != MAILIMF_ERROR_PARSE as libc::c_int {
res = r
} else {
r = mailimf_unstrict_crlf_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
bcc = mailimf_bcc_new(addr_list);
if bcc.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
*result = bcc;
*indx = cur_token;
return 1i32;
}
}
mailimf_address_list_free(addr_list);
}
}
}
return res;
}
/*
mailimf_address_list_parse will parse the given address list
@param message this is a string containing the address list
@param length this is the size of the given string
@param indx this is a pointer to the start of the address list in
the given string, (* indx) is modified to point at the end
of the parsed data
@param result the result of the parse operation is stored in
(* result)
@return MAILIMF_NO_ERROR on success, MAILIMF_ERROR_XXX on error
*/
pub unsafe fn mailimf_address_list_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_address_list,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut list: *mut clist = 0 as *mut clist;
let mut address_list: *mut mailimf_address_list = 0 as *mut mailimf_address_list;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
r = mailimf_struct_list_parse(
message,
length,
&mut cur_token,
&mut list,
',' as i32 as libc::c_char,
::std::mem::transmute::<
Option<
unsafe fn(
_: *const libc::c_char,
_: size_t,
_: *mut size_t,
_: *mut *mut mailimf_address,
) -> libc::c_int,
>,
Option<
unsafe fn(
_: *const libc::c_char,
_: size_t,
_: *mut size_t,
_: *mut libc::c_void,
) -> libc::c_int,
>,
>(Some(mailimf_address_parse)),
::std::mem::transmute::<
Option<unsafe fn(_: *mut mailimf_address) -> ()>,
Option<unsafe fn(_: *mut libc::c_void) -> libc::c_int>,
>(Some(mailimf_address_free)),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
address_list = mailimf_address_list_new(list);
if address_list.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int;
clist_foreach(
list,
::std::mem::transmute::<Option<unsafe fn(_: *mut mailimf_address) -> ()>, clist_func>(
Some(mailimf_address_free),
),
0 as *mut libc::c_void,
);
clist_free(list);
} else {
*result = address_list;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
return res;
}
/*
mailimf_address_parse will parse the given address
@param message this is a string containing the address
@param length this is the size of the given string
@param indx this is a pointer to the start of the address in
the given string, (* indx) is modified to point at the end
of the parsed data
@param result the result of the parse operation is stored in
(* result)
@return MAILIMF_NO_ERROR on success, MAILIMF_ERROR_XXX on error
*/
pub unsafe fn mailimf_address_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_address,
) -> libc::c_int {
let mut type_0: libc::c_int = 0;
let mut cur_token: size_t = 0;
let mut mailbox: *mut mailimf_mailbox = 0 as *mut mailimf_mailbox;
let mut group: *mut mailimf_group = 0 as *mut mailimf_group;
let mut address: *mut mailimf_address = 0 as *mut mailimf_address;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
mailbox = 0 as *mut mailimf_mailbox;
group = 0 as *mut mailimf_group;
type_0 = MAILIMF_ADDRESS_ERROR as libc::c_int;
r = mailimf_group_parse(message, length, &mut cur_token, &mut group);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = MAILIMF_ADDRESS_GROUP as libc::c_int
}
if r == MAILIMF_ERROR_PARSE as libc::c_int {
r = mailimf_mailbox_parse(message, length, &mut cur_token, &mut mailbox);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = MAILIMF_ADDRESS_MAILBOX as libc::c_int
}
}
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
address = mailimf_address_new(type_0, mailbox, group);
if address.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int;
if !mailbox.is_null() {
mailimf_mailbox_free(mailbox);
}
if !group.is_null() {
mailimf_group_free(group);
}
} else {
*result = address;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
return res;
}
/*
mailimf_mailbox_parse will parse the given address
@param message this is a string containing the mailbox
@param length this is the size of the given string
@param indx this is a pointer to the start of the mailbox in
the given string, (* indx) is modified to point at the end
of the parsed data
@param result the result of the parse operation is stored in
(* result)
@return MAILIMF_NO_ERROR on success, MAILIMF_ERROR_XXX on error
*/
pub unsafe fn mailimf_mailbox_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_mailbox,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut display_name: *mut libc::c_char = 0 as *mut libc::c_char;
let mut mailbox: *mut mailimf_mailbox = 0 as *mut mailimf_mailbox;
let mut addr_spec: *mut libc::c_char = 0 as *mut libc::c_char;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
display_name = 0 as *mut libc::c_char;
addr_spec = 0 as *mut libc::c_char;
r = mailimf_name_addr_parse(
message,
length,
&mut cur_token,
&mut display_name,
&mut addr_spec,
);
if r == MAILIMF_ERROR_PARSE as libc::c_int {
r = mailimf_addr_spec_parse(message, length, &mut cur_token, &mut addr_spec)
}
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
mailbox = mailimf_mailbox_new(display_name, addr_spec);
if mailbox.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int;
if !display_name.is_null() {
mailimf_display_name_free(display_name);
}
if !addr_spec.is_null() {
mailimf_addr_spec_free(addr_spec);
}
} else {
*result = mailbox;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
return res;
}
unsafe fn mailimf_addr_spec_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut libc::c_char,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut addr_spec: *mut libc::c_char = 0 as *mut libc::c_char;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
let mut begin: size_t = 0;
let mut end: size_t = 0;
let mut final_0: libc::c_int = 0;
let mut count: size_t = 0;
let mut src: *const libc::c_char = 0 as *const libc::c_char;
let mut dest: *mut libc::c_char = 0 as *mut libc::c_char;
let mut i: size_t = 0;
cur_token = *indx;
r = mailimf_cfws_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int && r != MAILIMF_ERROR_PARSE as libc::c_int {
res = r
} else {
end = cur_token;
if end >= length {
res = MAILIMF_ERROR_PARSE as libc::c_int
} else {
begin = cur_token;
final_0 = 0i32;
loop {
match *message.offset(end as isize) as libc::c_int {
62 | 44 | 13 | 10 | 40 | 41 | 58 | 59 => final_0 = 1i32,
_ => {}
}
if 0 != final_0 {
break;
}
end = end.wrapping_add(1);
if end >= length {
break;
}
}
if end == begin {
res = MAILIMF_ERROR_PARSE as libc::c_int
} else {
addr_spec = malloc(
end.wrapping_sub(cur_token)
.wrapping_add(1i32 as libc::size_t),
) as *mut libc::c_char;
if addr_spec.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
count = end.wrapping_sub(cur_token);
src = message.offset(cur_token as isize);
dest = addr_spec;
i = 0i32 as size_t;
while i < count {
if *src as libc::c_int != ' ' as i32 && *src as libc::c_int != '\t' as i32 {
*dest = *src;
dest = dest.offset(1isize)
}
src = src.offset(1isize);
i = i.wrapping_add(1)
}
*dest = '\u{0}' as i32 as libc::c_char;
cur_token = end;
*result = addr_spec;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
}
}
return res;
}
unsafe fn mailimf_name_addr_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut pdisplay_name: *mut *mut libc::c_char,
mut pangle_addr: *mut *mut libc::c_char,
) -> libc::c_int {
let mut display_name: *mut libc::c_char = 0 as *mut libc::c_char;
let mut angle_addr: *mut libc::c_char = 0 as *mut libc::c_char;
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
display_name = 0 as *mut libc::c_char;
angle_addr = 0 as *mut libc::c_char;
r = mailimf_display_name_parse(message, length, &mut cur_token, &mut display_name);
if r != MAILIMF_NO_ERROR as libc::c_int && r != MAILIMF_ERROR_PARSE as libc::c_int {
res = r
} else {
r = mailimf_angle_addr_parse(message, length, &mut cur_token, &mut angle_addr);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r;
if !display_name.is_null() {
mailimf_display_name_free(display_name);
}
} else {
*pdisplay_name = display_name;
*pangle_addr = angle_addr;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
return res;
}
unsafe fn mailimf_angle_addr_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut libc::c_char,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut addr_spec: *mut libc::c_char = 0 as *mut libc::c_char;
let mut r: libc::c_int = 0;
cur_token = *indx;
r = mailimf_cfws_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int && r != MAILIMF_ERROR_PARSE as libc::c_int {
return r;
}
r = mailimf_lower_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailimf_addr_spec_parse(message, length, &mut cur_token, &mut addr_spec);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailimf_greater_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
free(addr_spec as *mut libc::c_void);
return r;
}
*result = addr_spec;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailimf_display_name_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut libc::c_char,
) -> libc::c_int {
return mailimf_phrase_parse(message, length, indx, result);
}
unsafe fn mailimf_phrase_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut libc::c_char,
) -> libc::c_int {
let mut current_block: u64;
let mut gphrase: *mut MMAPString = 0 as *mut MMAPString;
let mut word: *mut libc::c_char = 0 as *mut libc::c_char;
let mut first: libc::c_int = 0;
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
let mut str: *mut libc::c_char = 0 as *mut libc::c_char;
let mut has_missing_closing_quote: libc::c_int = 0;
cur_token = *indx;
has_missing_closing_quote = 0i32;
gphrase = mmap_string_new(b"\x00" as *const u8 as *const libc::c_char);
if gphrase.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
first = 1i32;
loop {
let mut missing_quote: libc::c_int = 0i32;
r = mailimf_fws_word_parse(
message,
length,
&mut cur_token,
&mut word,
&mut missing_quote,
);
if 0 != missing_quote {
has_missing_closing_quote = 1i32
}
if r == MAILIMF_NO_ERROR as libc::c_int {
if 0 == first {
if mmap_string_append_c(gphrase, ' ' as i32 as libc::c_char).is_null() {
mailimf_word_free(word);
res = MAILIMF_ERROR_MEMORY as libc::c_int;
current_block = 17261756273978092585;
break;
}
}
if mmap_string_append(gphrase, word).is_null() {
mailimf_word_free(word);
res = MAILIMF_ERROR_MEMORY as libc::c_int;
current_block = 17261756273978092585;
break;
} else {
mailimf_word_free(word);
first = 0i32
}
} else {
if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 11636175345244025579;
break;
}
res = r;
current_block = 17261756273978092585;
break;
}
}
match current_block {
11636175345244025579 => {
if 0 != first {
res = MAILIMF_ERROR_PARSE as libc::c_int
} else {
if 0 != has_missing_closing_quote {
r = mailimf_char_parse(
message,
length,
&mut cur_token,
'\"' as i32 as libc::c_char,
)
}
str = strdup((*gphrase).str_0);
if str.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
mmap_string_free(gphrase);
*result = str;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
}
_ => {}
}
mmap_string_free(gphrase);
}
return res;
}
pub unsafe fn mailimf_fws_word_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut libc::c_char,
mut p_missing_closing_quote: *mut libc::c_int,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut word: *mut libc::c_char = 0 as *mut libc::c_char;
let mut r: libc::c_int = 0;
let mut missing_closing_quote: libc::c_int = 0;
cur_token = *indx;
missing_closing_quote = 0i32;
r = mailimf_fws_atom_for_word_parse(
message,
length,
&mut cur_token,
&mut word,
&mut missing_closing_quote,
);
if r == MAILIMF_ERROR_PARSE as libc::c_int {
r = mailimf_fws_quoted_string_parse(message, length, &mut cur_token, &mut word)
}
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
*result = word;
*indx = cur_token;
*p_missing_closing_quote = missing_closing_quote;
return MAILIMF_NO_ERROR as libc::c_int;
}
pub unsafe fn mailimf_fws_quoted_string_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut libc::c_char,
) -> libc::c_int {
let mut current_block: u64;
let mut cur_token: size_t = 0;
let mut gstr: *mut MMAPString = 0 as *mut MMAPString;
let mut ch: libc::c_char = 0;
let mut str: *mut libc::c_char = 0 as *mut libc::c_char;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
r = mailimf_fws_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int && r != MAILIMF_ERROR_PARSE as libc::c_int {
res = r
} else {
r = mailimf_dquote_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
gstr = mmap_string_new(b"\x00" as *const u8 as *const libc::c_char);
if gstr.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
loop {
r = mailimf_fws_parse(message, length, &mut cur_token);
if r == MAILIMF_NO_ERROR as libc::c_int {
if mmap_string_append_c(gstr, ' ' as i32 as libc::c_char).is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int;
current_block = 15096897878952122875;
break;
}
} else if r != MAILIMF_ERROR_PARSE as libc::c_int {
res = r;
current_block = 15096897878952122875;
break;
}
r = mailimf_qcontent_parse(message, length, &mut cur_token, &mut ch);
if r == MAILIMF_NO_ERROR as libc::c_int {
if !mmap_string_append_c(gstr, ch).is_null() {
continue;
}
res = MAILIMF_ERROR_MEMORY as libc::c_int;
current_block = 15096897878952122875;
break;
} else {
if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 5494826135382683477;
break;
}
res = r;
current_block = 15096897878952122875;
break;
}
}
match current_block {
5494826135382683477 => {
r = mailimf_dquote_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
str = strdup((*gstr).str_0);
if str.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
mmap_string_free(gstr);
*indx = cur_token;
*result = str;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
}
_ => {}
}
mmap_string_free(gstr);
}
}
}
return res;
}
unsafe fn mailimf_dquote_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
) -> libc::c_int {
return mailimf_char_parse(message, length, indx, '\"' as i32 as libc::c_char);
}
unsafe fn mailimf_qcontent_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut libc::c_char,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut ch: libc::c_char = 0;
let mut r: libc::c_int = 0;
cur_token = *indx;
if cur_token >= length {
return MAILIMF_ERROR_PARSE as libc::c_int;
}
if 0 != is_qtext(*message.offset(cur_token as isize)) {
ch = *message.offset(cur_token as isize);
cur_token = cur_token.wrapping_add(1)
} else {
r = mailimf_quoted_pair_parse(message, length, &mut cur_token, &mut ch);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
}
*result = ch;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
/*
dot-atom = [CFWS] dot-atom-text [CFWS]
*/
/*
dot-atom-text = 1*atext *("." 1*atext)
*/
/*
qtext = NO-WS-CTL / ; Non white space controls
%d33 / ; The rest of the US-ASCII
%d35-91 / ; characters not including "\"
%d93-126 ; or the quote character
*/
#[inline]
unsafe fn is_qtext(mut ch: libc::c_char) -> libc::c_int {
let mut uch: libc::c_uchar = ch as libc::c_uchar;
if 0 != is_no_ws_ctl(ch) {
return 1i32;
}
if (uch as libc::c_int) < 33i32 {
return 0i32;
}
if uch as libc::c_int == 34i32 {
return 0i32;
}
if uch as libc::c_int == 92i32 {
return 0i32;
}
if uch as libc::c_int == 127i32 {
return 0i32;
}
return 1i32;
}
unsafe fn mailimf_fws_atom_for_word_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut libc::c_char,
mut p_missing_closing_quote: *mut libc::c_int,
) -> libc::c_int {
let mut end: size_t = 0;
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
let mut word: *mut mailmime_encoded_word = 0 as *mut mailmime_encoded_word;
let mut has_fwd: libc::c_int = 0;
let mut missing_closing_quote: libc::c_int = 0;
let mut atom: *mut libc::c_char = 0 as *mut libc::c_char;
cur_token = *indx;
missing_closing_quote = 0i32;
r = mailimf_fws_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int && r != MAILIMF_ERROR_PARSE as libc::c_int {
res = r
} else {
end = cur_token;
r = mailmime_encoded_word_parse(
message,
length,
&mut cur_token,
&mut word,
&mut has_fwd,
&mut missing_closing_quote,
);
if r != MAILIMF_NO_ERROR as libc::c_int && r != MAILIMF_ERROR_PARSE as libc::c_int {
res = r
} else {
if r == MAILIMF_ERROR_PARSE as libc::c_int {
return mailimf_fws_atom_parse(message, length, indx, result);
}
mailmime_encoded_word_free(word);
atom = malloc(
cur_token
.wrapping_sub(end)
.wrapping_add(1i32 as libc::size_t),
) as *mut libc::c_char;
if atom.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
strncpy(
atom,
message.offset(end as isize),
cur_token.wrapping_sub(end),
);
*atom.offset(cur_token.wrapping_sub(end) as isize) = '\u{0}' as i32 as libc::c_char;
*result = atom;
*indx = cur_token;
*p_missing_closing_quote = missing_closing_quote;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
}
return res;
}
pub unsafe fn mailimf_fws_atom_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut libc::c_char,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
let mut atom: *mut libc::c_char = 0 as *mut libc::c_char;
let mut end: size_t = 0;
cur_token = *indx;
r = mailimf_fws_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int && r != MAILIMF_ERROR_PARSE as libc::c_int {
res = r
} else {
end = cur_token;
if end >= length {
res = MAILIMF_ERROR_PARSE as libc::c_int
} else {
while 0 != is_atext(*message.offset(end as isize)) {
end = end.wrapping_add(1);
if end >= length {
break;
}
}
if end == cur_token {
res = MAILIMF_ERROR_PARSE as libc::c_int
} else {
atom = malloc(
end.wrapping_sub(cur_token)
.wrapping_add(1i32 as libc::size_t),
) as *mut libc::c_char;
if atom.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
strncpy(
atom,
message.offset(cur_token as isize),
end.wrapping_sub(cur_token),
);
*atom.offset(end.wrapping_sub(cur_token) as isize) =
'\u{0}' as i32 as libc::c_char;
cur_token = end;
*indx = cur_token;
*result = atom;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
}
}
return res;
}
/*
atext = ALPHA / DIGIT / ; Any character except controls,
"!" / "#" / ; SP, and specials.
"$" / "%" / ; Used for atoms
"&" / "'" /
"*" / "+" /
"-" / "/" /
"=" / "?" /
"^" / "_" /
"`" / "{" /
"|" / "}" /
"~"
*/
#[inline]
unsafe fn is_atext(mut ch: libc::c_char) -> libc::c_int {
match ch as libc::c_int {
32 | 9 | 10 | 13 | 60 | 62 | 44 | 34 | 58 | 59 => return 0i32,
_ => return 1i32,
};
}
unsafe fn mailimf_group_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_group,
) -> libc::c_int {
let mut current_block: u64;
let mut cur_token: size_t = 0;
let mut display_name: *mut libc::c_char = 0 as *mut libc::c_char;
let mut mailbox_list: *mut mailimf_mailbox_list = 0 as *mut mailimf_mailbox_list;
let mut group: *mut mailimf_group = 0 as *mut mailimf_group;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
let mut list: *mut clist = 0 as *mut clist;
cur_token = *indx;
mailbox_list = 0 as *mut mailimf_mailbox_list;
r = mailimf_display_name_parse(message, length, &mut cur_token, &mut display_name);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_colon_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_mailbox_list_parse(message, length, &mut cur_token, &mut mailbox_list);
match r {
0 => {
current_block = 1608152415753874203;
}
1 => {
r = mailimf_cfws_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int
&& r != MAILIMF_ERROR_PARSE as libc::c_int
{
res = r;
current_block = 14904789583098922708;
} else {
list = clist_new();
if list.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int;
current_block = 14904789583098922708;
} else {
mailbox_list = mailimf_mailbox_list_new(list);
if mailbox_list.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int;
clist_free(list);
current_block = 14904789583098922708;
} else {
current_block = 1608152415753874203;
}
}
}
}
_ => {
res = r;
current_block = 14904789583098922708;
}
}
match current_block {
14904789583098922708 => {}
_ => {
r = mailimf_semi_colon_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
group = mailimf_group_new(display_name, mailbox_list);
if group.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
*indx = cur_token;
*result = group;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
if !mailbox_list.is_null() {
mailimf_mailbox_list_free(mailbox_list);
}
}
}
}
mailimf_display_name_free(display_name);
}
return res;
}
unsafe fn mailimf_semi_colon_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
) -> libc::c_int {
return mailimf_unstrict_char_parse(message, length, indx, ';' as i32 as libc::c_char);
}
/*
mailimf_mailbox_list_parse will parse the given mailbox list
@param message this is a string containing the mailbox list
@param length this is the size of the given string
@param indx this is a pointer to the start of the mailbox list in
the given string, (* indx) is modified to point at the end
of the parsed data
@param result the result of the parse operation is stored in
(* result)
@return MAILIMF_NO_ERROR on success, MAILIMF_ERROR_XXX on error
*/
pub unsafe fn mailimf_mailbox_list_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_mailbox_list,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut list: *mut clist = 0 as *mut clist;
let mut mailbox_list: *mut mailimf_mailbox_list = 0 as *mut mailimf_mailbox_list;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
r = mailimf_struct_list_parse(
message,
length,
&mut cur_token,
&mut list,
',' as i32 as libc::c_char,
::std::mem::transmute::<
Option<
unsafe fn(
_: *const libc::c_char,
_: size_t,
_: *mut size_t,
_: *mut *mut mailimf_mailbox,
) -> libc::c_int,
>,
Option<
unsafe fn(
_: *const libc::c_char,
_: size_t,
_: *mut size_t,
_: *mut libc::c_void,
) -> libc::c_int,
>,
>(Some(mailimf_mailbox_parse)),
::std::mem::transmute::<
Option<unsafe fn(_: *mut mailimf_mailbox) -> ()>,
Option<unsafe fn(_: *mut libc::c_void) -> libc::c_int>,
>(Some(mailimf_mailbox_free)),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
mailbox_list = mailimf_mailbox_list_new(list);
if mailbox_list.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int;
clist_foreach(
list,
::std::mem::transmute::<Option<unsafe fn(_: *mut mailimf_mailbox) -> ()>, clist_func>(
Some(mailimf_mailbox_free),
),
0 as *mut libc::c_void,
);
clist_free(list);
} else {
*result = mailbox_list;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
return res;
}
unsafe fn mailimf_struct_list_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut clist,
mut symbol: libc::c_char,
mut parser: Option<
unsafe fn(
_: *const libc::c_char,
_: size_t,
_: *mut size_t,
_: *mut libc::c_void,
) -> libc::c_int,
>,
mut destructor: Option<unsafe fn(_: *mut libc::c_void) -> libc::c_int>,
) -> libc::c_int {
let mut current_block: u64;
let mut struct_list: *mut clist = 0 as *mut clist;
let mut cur_token: size_t = 0;
let mut value: *mut libc::c_void = 0 as *mut libc::c_void;
let mut final_token: size_t = 0;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
r = parser.expect("non-null function pointer")(
message,
length,
&mut cur_token,
&mut value as *mut *mut libc::c_void as *mut libc::c_void,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
struct_list = clist_new();
if struct_list.is_null() {
destructor.expect("non-null function pointer")(value);
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
r = clist_insert_after(struct_list, (*struct_list).last, value);
if r < 0i32 {
destructor.expect("non-null function pointer")(value);
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
final_token = cur_token;
loop {
r = mailimf_unstrict_char_parse(message, length, &mut cur_token, symbol);
if r != MAILIMF_NO_ERROR as libc::c_int {
if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 9853141518545631134;
break;
}
res = r;
current_block = 17524159567010234572;
break;
} else {
r = parser.expect("non-null function pointer")(
message,
length,
&mut cur_token,
&mut value as *mut *mut libc::c_void as *mut libc::c_void,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 9853141518545631134;
break;
}
res = r;
current_block = 17524159567010234572;
break;
} else {
r = clist_insert_after(struct_list, (*struct_list).last, value);
if r < 0i32 {
destructor.expect("non-null function pointer")(value);
res = MAILIMF_ERROR_MEMORY as libc::c_int;
current_block = 17524159567010234572;
break;
} else {
final_token = cur_token
}
}
}
}
match current_block {
17524159567010234572 => {}
_ => {
*result = struct_list;
*indx = final_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
}
clist_foreach(
struct_list,
::std::mem::transmute::<
Option<unsafe fn(_: *mut libc::c_void) -> libc::c_int>,
clist_func,
>(destructor),
0 as *mut libc::c_void,
);
clist_free(struct_list);
}
}
return res;
}
unsafe fn mailimf_resent_cc_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_cc,
) -> libc::c_int {
let mut addr_list: *mut mailimf_address_list = 0 as *mut mailimf_address_list;
let mut cc: *mut mailimf_cc = 0 as *mut mailimf_cc;
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
r = mailimf_token_case_insensitive_len_parse(
message,
length,
&mut cur_token,
b"Resent-Cc\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
strlen(b"Resent-Cc\x00" as *const u8 as *const libc::c_char),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_colon_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_address_list_parse(message, length, &mut cur_token, &mut addr_list);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_unstrict_crlf_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
cc = mailimf_cc_new(addr_list);
if cc.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
*result = cc;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
mailimf_address_list_free(addr_list);
}
}
}
return res;
}
unsafe fn mailimf_resent_to_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_to,
) -> libc::c_int {
let mut addr_list: *mut mailimf_address_list = 0 as *mut mailimf_address_list;
let mut to: *mut mailimf_to = 0 as *mut mailimf_to;
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
r = mailimf_token_case_insensitive_len_parse(
message,
length,
&mut cur_token,
b"Resent-To\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
strlen(b"Resent-To\x00" as *const u8 as *const libc::c_char),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_colon_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_address_list_parse(message, length, &mut cur_token, &mut addr_list);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_unstrict_crlf_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
to = mailimf_to_new(addr_list);
if to.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
*result = to;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
mailimf_address_list_free(addr_list);
}
}
}
return res;
}
unsafe fn mailimf_resent_sender_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_sender,
) -> libc::c_int {
let mut mb: *mut mailimf_mailbox = 0 as *mut mailimf_mailbox;
let mut sender: *mut mailimf_sender = 0 as *mut mailimf_sender;
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = length;
r = mailimf_token_case_insensitive_len_parse(
message,
length,
&mut cur_token,
b"Resent-Sender\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
strlen(b"Resent-Sender\x00" as *const u8 as *const libc::c_char),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_colon_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_mailbox_parse(message, length, &mut cur_token, &mut mb);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_unstrict_crlf_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
sender = mailimf_sender_new(mb);
if sender.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
*result = sender;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
mailimf_mailbox_free(mb);
}
}
}
return res;
}
unsafe fn mailimf_resent_from_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_from,
) -> libc::c_int {
let mut mb_list: *mut mailimf_mailbox_list = 0 as *mut mailimf_mailbox_list;
let mut from: *mut mailimf_from = 0 as *mut mailimf_from;
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
r = mailimf_token_case_insensitive_len_parse(
message,
length,
&mut cur_token,
b"Resent-From\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
strlen(b"Resent-From\x00" as *const u8 as *const libc::c_char),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_colon_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_mailbox_list_parse(message, length, &mut cur_token, &mut mb_list);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_unstrict_crlf_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
from = mailimf_from_new(mb_list);
if from.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
*result = from;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
mailimf_mailbox_list_free(mb_list);
}
}
}
return res;
}
unsafe fn mailimf_resent_date_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_orig_date,
) -> libc::c_int {
let mut orig_date: *mut mailimf_orig_date = 0 as *mut mailimf_orig_date;
let mut date_time: *mut mailimf_date_time = 0 as *mut mailimf_date_time;
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
r = mailimf_token_case_insensitive_len_parse(
message,
length,
&mut cur_token,
b"Resent-Date\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
strlen(b"Resent-Date\x00" as *const u8 as *const libc::c_char),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_colon_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_date_time_parse(message, length, &mut cur_token, &mut date_time);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_unstrict_crlf_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
orig_date = mailimf_orig_date_new(date_time);
if orig_date.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
*result = orig_date;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
mailimf_date_time_free(date_time);
}
}
}
return res;
}
/*
mailimf_date_time_parse will parse the given RFC 2822 date
@param message this is a string containing the date
@param length this is the size of the given string
@param indx this is a pointer to the start of the date in
the given string, (* indx) is modified to point at the end
of the parsed data
@param result the result of the parse operation is stored in
(* result)
@return MAILIMF_NO_ERROR on success, MAILIMF_ERROR_XXX on error
*/
pub unsafe fn mailimf_date_time_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_date_time,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut day_of_week: libc::c_int = 0;
let mut date_time: *mut mailimf_date_time = 0 as *mut mailimf_date_time;
let mut day: libc::c_int = 0;
let mut month: libc::c_int = 0;
let mut year: libc::c_int = 0;
let mut hour: libc::c_int = 0;
let mut min: libc::c_int = 0;
let mut sec: libc::c_int = 0;
let mut zone: libc::c_int = 0;
let mut r: libc::c_int = 0;
cur_token = *indx;
day_of_week = -1i32;
r = mailimf_day_of_week_parse(message, length, &mut cur_token, &mut day_of_week);
if r == MAILIMF_NO_ERROR as libc::c_int {
r = mailimf_comma_parse(message, length, &mut cur_token);
if !(r == MAILIMF_ERROR_PARSE as libc::c_int) {
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
}
} else if r != MAILIMF_ERROR_PARSE as libc::c_int {
return r;
}
day = 0i32;
month = 0i32;
year = 0i32;
r = mailimf_date_parse(
message,
length,
&mut cur_token,
&mut day,
&mut month,
&mut year,
);
if r == MAILIMF_ERROR_PARSE as libc::c_int {
r = mailimf_broken_date_parse(
message,
length,
&mut cur_token,
&mut day,
&mut month,
&mut year,
)
} else if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailimf_fws_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
hour = 0i32;
min = 0i32;
sec = 0i32;
zone = 0i32;
r = mailimf_time_parse(
message,
length,
&mut cur_token,
&mut hour,
&mut min,
&mut sec,
&mut zone,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
date_time = mailimf_date_time_new(day, month, year, hour, min, sec, zone);
if date_time.is_null() {
return MAILIMF_ERROR_MEMORY as libc::c_int;
}
*indx = cur_token;
*result = date_time;
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailimf_time_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut phour: *mut libc::c_int,
mut pmin: *mut libc::c_int,
mut psec: *mut libc::c_int,
mut pzone: *mut libc::c_int,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut hour: libc::c_int = 0;
let mut min: libc::c_int = 0;
let mut sec: libc::c_int = 0;
let mut zone: libc::c_int = 0;
let mut r: libc::c_int = 0;
cur_token = *indx;
r = mailimf_cfws_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int && r != MAILIMF_ERROR_PARSE as libc::c_int {
return r;
}
r = mailimf_time_of_day_parse(
message,
length,
&mut cur_token,
&mut hour,
&mut min,
&mut sec,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailimf_fws_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int && r != MAILIMF_ERROR_PARSE as libc::c_int {
return r;
}
r = mailimf_zone_parse(message, length, &mut cur_token, &mut zone);
if !(r == MAILIMF_NO_ERROR as libc::c_int) {
if r == MAILIMF_ERROR_PARSE as libc::c_int {
zone = 0i32
} else {
return r;
}
}
*phour = hour;
*pmin = min;
*psec = sec;
*pzone = zone;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailimf_zone_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut libc::c_int,
) -> libc::c_int {
let mut zone: libc::c_int = 0;
let mut sign: libc::c_int = 0;
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
let mut value: uint32_t = 0;
cur_token = *indx;
if cur_token.wrapping_add(1i32 as libc::size_t) < length {
if *message.offset(cur_token as isize) as libc::c_int == 'U' as i32
&& *message.offset(cur_token.wrapping_add(1i32 as libc::size_t) as isize) as libc::c_int
== 'T' as i32
{
*result = 1i32;
*indx = cur_token.wrapping_add(2i32 as libc::size_t);
return MAILIMF_NO_ERROR as libc::c_int;
}
}
zone = 0i32;
if cur_token.wrapping_add(2i32 as libc::size_t) < length {
let mut state: libc::c_int = 0;
state = STATE_ZONE_1 as libc::c_int;
while state <= 2i32 {
match state {
0 => match *message.offset(cur_token as isize) as libc::c_int {
71 => {
if *message.offset(cur_token.wrapping_add(1i32 as libc::size_t) as isize)
as libc::c_int
== 'M' as i32
&& *message
.offset(cur_token.wrapping_add(2i32 as libc::size_t) as isize)
as libc::c_int
== 'T' as i32
{
if cur_token.wrapping_add(3i32 as libc::size_t) < length
&& (*message
.offset(cur_token.wrapping_add(3i32 as libc::size_t) as isize)
as libc::c_int
== '+' as i32
|| *message.offset(
cur_token.wrapping_add(3i32 as libc::size_t) as isize
) as libc::c_int
== '-' as i32)
{
cur_token = (cur_token as libc::size_t)
.wrapping_add(3i32 as libc::size_t)
as size_t as size_t;
state = STATE_ZONE_CONT as libc::c_int
} else {
zone = 0i32;
state = STATE_ZONE_OK as libc::c_int
}
} else {
state = STATE_ZONE_ERR as libc::c_int
}
}
69 => {
zone = -5i32;
state = STATE_ZONE_2 as libc::c_int
}
67 => {
zone = -6i32;
state = STATE_ZONE_2 as libc::c_int
}
77 => {
zone = -7i32;
state = STATE_ZONE_2 as libc::c_int
}
80 => {
zone = -8i32;
state = STATE_ZONE_2 as libc::c_int
}
_ => state = STATE_ZONE_CONT as libc::c_int,
},
1 => {
match *message.offset(cur_token.wrapping_add(1i32 as libc::size_t) as isize)
as libc::c_int
{
83 => state = STATE_ZONE_3 as libc::c_int,
68 => {
zone += 1;
state = STATE_ZONE_3 as libc::c_int
}
_ => state = STATE_ZONE_ERR as libc::c_int,
}
}
2 => {
if *message.offset(cur_token.wrapping_add(2i32 as libc::size_t) as isize)
as libc::c_int
== 'T' as i32
{
zone *= 100i32;
state = STATE_ZONE_OK as libc::c_int
} else {
state = STATE_ZONE_ERR as libc::c_int
}
}
_ => {}
}
}
match state {
3 => {
*result = zone;
*indx = cur_token.wrapping_add(3i32 as libc::size_t);
return MAILIMF_NO_ERROR as libc::c_int;
}
4 => return MAILIMF_ERROR_PARSE as libc::c_int,
_ => {}
}
}
sign = 1i32;
r = mailimf_plus_parse(message, length, &mut cur_token);
if r == MAILIMF_NO_ERROR as libc::c_int {
sign = 1i32
}
if r == MAILIMF_ERROR_PARSE as libc::c_int {
r = mailimf_minus_parse(message, length, &mut cur_token);
if r == MAILIMF_NO_ERROR as libc::c_int {
sign = -1i32
}
}
if !(r == MAILIMF_NO_ERROR as libc::c_int) {
if r == MAILIMF_ERROR_PARSE as libc::c_int {
sign = 1i32
} else {
return r;
}
}
r = mailimf_number_parse(message, length, &mut cur_token, &mut value);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
zone = value.wrapping_mul(sign as libc::c_uint) as libc::c_int;
*indx = cur_token;
*result = zone;
return MAILIMF_NO_ERROR as libc::c_int;
}
pub unsafe fn mailimf_number_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut uint32_t,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut digit: libc::c_int = 0;
let mut number: uint32_t = 0;
let mut parsed: libc::c_int = 0;
let mut r: libc::c_int = 0;
cur_token = *indx;
parsed = 0i32;
number = 0i32 as uint32_t;
loop {
r = mailimf_digit_parse(message, length, &mut cur_token, &mut digit);
if r != MAILIMF_NO_ERROR as libc::c_int {
if r == MAILIMF_ERROR_PARSE as libc::c_int {
break;
}
return r;
} else {
number = (number as libc::c_uint).wrapping_mul(10i32 as libc::c_uint) as uint32_t
as uint32_t;
number = (number as libc::c_uint).wrapping_add(digit as libc::c_uint) as uint32_t
as uint32_t;
parsed = 1i32
}
}
if 0 == parsed {
return MAILIMF_ERROR_PARSE as libc::c_int;
}
*result = number;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailimf_digit_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut libc::c_int,
) -> libc::c_int {
let mut cur_token: size_t = 0;
cur_token = *indx;
if cur_token >= length {
return MAILIMF_ERROR_PARSE as libc::c_int;
}
if 0 != is_digit(*message.offset(cur_token as isize)) {
*result = *message.offset(cur_token as isize) as libc::c_int - '0' as i32;
cur_token = cur_token.wrapping_add(1);
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
} else {
return MAILIMF_ERROR_PARSE as libc::c_int;
};
}
/* *************************************************************** */
#[inline]
unsafe fn is_digit(mut ch: libc::c_char) -> libc::c_int {
return (ch as libc::c_int >= '0' as i32 && ch as libc::c_int <= '9' as i32) as libc::c_int;
}
unsafe fn mailimf_minus_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
) -> libc::c_int {
return mailimf_unstrict_char_parse(message, length, indx, '-' as i32 as libc::c_char);
}
unsafe fn mailimf_plus_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
) -> libc::c_int {
return mailimf_unstrict_char_parse(message, length, indx, '+' as i32 as libc::c_char);
}
unsafe fn mailimf_time_of_day_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut phour: *mut libc::c_int,
mut pmin: *mut libc::c_int,
mut psec: *mut libc::c_int,
) -> libc::c_int {
let mut hour: libc::c_int = 0;
let mut min: libc::c_int = 0;
let mut sec: libc::c_int = 0;
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
cur_token = *indx;
r = mailimf_hour_parse(message, length, &mut cur_token, &mut hour);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailimf_colon_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailimf_minute_parse(message, length, &mut cur_token, &mut min);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailimf_colon_parse(message, length, &mut cur_token);
if r == MAILIMF_NO_ERROR as libc::c_int {
r = mailimf_second_parse(message, length, &mut cur_token, &mut sec);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
sec = 0i32
} else {
return r;
}
*phour = hour;
*pmin = min;
*psec = sec;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailimf_second_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut libc::c_int,
) -> libc::c_int {
let mut second: uint32_t = 0;
let mut r: libc::c_int = 0;
r = mailimf_number_parse(message, length, indx, &mut second);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
*result = second as libc::c_int;
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailimf_minute_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut libc::c_int,
) -> libc::c_int {
let mut minute: uint32_t = 0;
let mut r: libc::c_int = 0;
r = mailimf_number_parse(message, length, indx, &mut minute);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
*result = minute as libc::c_int;
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailimf_hour_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut libc::c_int,
) -> libc::c_int {
let mut hour: uint32_t = 0;
let mut r: libc::c_int = 0;
r = mailimf_number_parse(message, length, indx, &mut hour);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
*result = hour as libc::c_int;
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailimf_broken_date_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut pday: *mut libc::c_int,
mut pmonth: *mut libc::c_int,
mut pyear: *mut libc::c_int,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut day: libc::c_int = 0;
let mut month: libc::c_int = 0;
let mut year: libc::c_int = 0;
let mut r: libc::c_int = 0;
cur_token = *indx;
month = 1i32;
r = mailimf_month_parse(message, length, &mut cur_token, &mut month);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
day = 1i32;
r = mailimf_day_parse(message, length, &mut cur_token, &mut day);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
year = 2001i32;
r = mailimf_year_parse(message, length, &mut cur_token, &mut year);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
*pday = day;
*pmonth = month;
*pyear = year;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailimf_year_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut libc::c_int,
) -> libc::c_int {
let mut number: uint32_t = 0;
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
cur_token = *indx;
r = mailimf_cfws_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int && r != MAILIMF_ERROR_PARSE as libc::c_int {
return r;
}
r = mailimf_number_parse(message, length, &mut cur_token, &mut number);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
*indx = cur_token;
*result = number as libc::c_int;
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailimf_day_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut libc::c_int,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut day: uint32_t = 0;
let mut r: libc::c_int = 0;
cur_token = *indx;
r = mailimf_cfws_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int && r != MAILIMF_ERROR_PARSE as libc::c_int {
return r;
}
r = mailimf_number_parse(message, length, &mut cur_token, &mut day);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
*result = day as libc::c_int;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailimf_month_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut libc::c_int,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut month: libc::c_int = 0;
let mut r: libc::c_int = 0;
cur_token = *indx;
r = mailimf_cfws_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int && r != MAILIMF_ERROR_PARSE as libc::c_int {
return r;
}
r = mailimf_month_name_parse(message, length, &mut cur_token, &mut month);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
*result = month;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailimf_month_name_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut libc::c_int,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut month: libc::c_int = 0;
let mut guessed_month: libc::c_int = 0;
let mut r: libc::c_int = 0;
cur_token = *indx;
guessed_month = guess_month(message, length, cur_token);
if guessed_month == -1i32 {
return MAILIMF_ERROR_PARSE as libc::c_int;
}
r = mailimf_token_case_insensitive_len_parse(
message,
length,
&mut cur_token,
month_names[(guessed_month - 1i32) as usize].str_0,
strlen(month_names[(guessed_month - 1i32) as usize].str_0),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
month = guessed_month;
*result = month;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
/*
month-name = "Jan" / "Feb" / "Mar" / "Apr" /
"May" / "Jun" / "Jul" / "Aug" /
"Sep" / "Oct" / "Nov" / "Dec"
*/
static mut month_names: [mailimf_token_value; 12] = [
mailimf_token_value {
value: 1i32,
str_0: b"Jan\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
},
mailimf_token_value {
value: 2i32,
str_0: b"Feb\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
},
mailimf_token_value {
value: 3i32,
str_0: b"Mar\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
},
mailimf_token_value {
value: 4i32,
str_0: b"Apr\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
},
mailimf_token_value {
value: 5i32,
str_0: b"May\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
},
mailimf_token_value {
value: 6i32,
str_0: b"Jun\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
},
mailimf_token_value {
value: 7i32,
str_0: b"Jul\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
},
mailimf_token_value {
value: 8i32,
str_0: b"Aug\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
},
mailimf_token_value {
value: 9i32,
str_0: b"Sep\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
},
mailimf_token_value {
value: 10i32,
str_0: b"Oct\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
},
mailimf_token_value {
value: 11i32,
str_0: b"Nov\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
},
mailimf_token_value {
value: 12i32,
str_0: b"Dec\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
},
];
unsafe fn guess_month(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: size_t,
) -> libc::c_int {
let mut state: libc::c_int = 0;
state = MONTH_START as libc::c_int;
loop {
if indx >= length {
return -1i32;
}
match state {
0 => {
match toupper(*message.offset(indx as isize) as libc::c_uchar as libc::c_int)
as libc::c_char as libc::c_int
{
74 => state = MONTH_J as libc::c_int,
70 => return 2i32,
77 => state = MONTH_M as libc::c_int,
65 => state = MONTH_A as libc::c_int,
83 => return 9i32,
79 => return 10i32,
78 => return 11i32,
68 => return 12i32,
_ => return -1i32,
}
}
1 => {
match toupper(*message.offset(indx as isize) as libc::c_uchar as libc::c_int)
as libc::c_char as libc::c_int
{
65 => return 1i32,
85 => state = MONTH_JU as libc::c_int,
_ => return -1i32,
}
}
2 => {
match toupper(*message.offset(indx as isize) as libc::c_uchar as libc::c_int)
as libc::c_char as libc::c_int
{
78 => return 6i32,
76 => return 7i32,
_ => return -1i32,
}
}
3 => {
match toupper(*message.offset(indx as isize) as libc::c_uchar as libc::c_int)
as libc::c_char as libc::c_int
{
65 => state = MONTH_MA as libc::c_int,
_ => return -1i32,
}
}
4 => {
match toupper(*message.offset(indx as isize) as libc::c_uchar as libc::c_int)
as libc::c_char as libc::c_int
{
89 => return 5i32,
82 => return 3i32,
_ => return -1i32,
}
}
5 => {
match toupper(*message.offset(indx as isize) as libc::c_uchar as libc::c_int)
as libc::c_char as libc::c_int
{
80 => return 4i32,
85 => return 8i32,
_ => return -1i32,
}
}
_ => {}
}
indx = indx.wrapping_add(1)
}
}
unsafe fn mailimf_date_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut pday: *mut libc::c_int,
mut pmonth: *mut libc::c_int,
mut pyear: *mut libc::c_int,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut day: libc::c_int = 0;
let mut month: libc::c_int = 0;
let mut year: libc::c_int = 0;
let mut r: libc::c_int = 0;
cur_token = *indx;
day = 1i32;
r = mailimf_day_parse(message, length, &mut cur_token, &mut day);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
month = 1i32;
r = mailimf_month_parse(message, length, &mut cur_token, &mut month);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
year = 2001i32;
r = mailimf_year_parse(message, length, &mut cur_token, &mut year);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
*pday = day;
*pmonth = month;
*pyear = year;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailimf_comma_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
) -> libc::c_int {
return mailimf_unstrict_char_parse(message, length, indx, ',' as i32 as libc::c_char);
}
unsafe fn mailimf_day_of_week_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut libc::c_int,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut day_of_week: libc::c_int = 0;
let mut r: libc::c_int = 0;
cur_token = *indx;
r = mailimf_cfws_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int && r != MAILIMF_ERROR_PARSE as libc::c_int {
return r;
}
r = mailimf_day_name_parse(message, length, &mut cur_token, &mut day_of_week);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
*indx = cur_token;
*result = day_of_week;
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailimf_day_name_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut libc::c_int,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut day_of_week: libc::c_int = 0;
let mut guessed_day: libc::c_int = 0;
let mut r: libc::c_int = 0;
cur_token = *indx;
guessed_day = guess_day_name(message, length, cur_token);
if guessed_day == -1i32 {
return MAILIMF_ERROR_PARSE as libc::c_int;
}
r = mailimf_token_case_insensitive_len_parse(
message,
length,
&mut cur_token,
day_names[(guessed_day - 1i32) as usize].str_0,
strlen(day_names[(guessed_day - 1i32) as usize].str_0),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
day_of_week = guessed_day;
*result = day_of_week;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
static mut day_names: [mailimf_token_value; 7] = [
mailimf_token_value {
value: 1i32,
str_0: b"Mon\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
},
mailimf_token_value {
value: 2i32,
str_0: b"Tue\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
},
mailimf_token_value {
value: 3i32,
str_0: b"Wed\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
},
mailimf_token_value {
value: 4i32,
str_0: b"Thu\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
},
mailimf_token_value {
value: 5i32,
str_0: b"Fri\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
},
mailimf_token_value {
value: 6i32,
str_0: b"Sat\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
},
mailimf_token_value {
value: 7i32,
str_0: b"Sun\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
},
];
unsafe fn guess_day_name(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: size_t,
) -> libc::c_int {
let mut state: libc::c_int = 0;
state = DAY_NAME_START as libc::c_int;
loop {
if indx >= length {
return -1i32;
}
match state {
0 => {
match toupper(*message.offset(indx as isize) as libc::c_uchar as libc::c_int)
as libc::c_char as libc::c_int
{
77 => return 1i32,
84 => state = DAY_NAME_T as libc::c_int,
87 => return 3i32,
70 => return 5i32,
83 => state = DAY_NAME_S as libc::c_int,
_ => return -1i32,
}
}
1 => {
match toupper(*message.offset(indx as isize) as libc::c_uchar as libc::c_int)
as libc::c_char as libc::c_int
{
85 => return 2i32,
72 => return 4i32,
_ => return -1i32,
}
}
2 => {
match toupper(*message.offset(indx as isize) as libc::c_uchar as libc::c_int)
as libc::c_char as libc::c_int
{
65 => return 6i32,
85 => return 7i32,
_ => return -1i32,
}
}
_ => {}
}
indx = indx.wrapping_add(1)
}
}
unsafe fn mailimf_return_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_return,
) -> libc::c_int {
let mut path: *mut mailimf_path = 0 as *mut mailimf_path;
let mut return_path: *mut mailimf_return = 0 as *mut mailimf_return;
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
r = mailimf_token_case_insensitive_len_parse(
message,
length,
&mut cur_token,
b"Return-Path\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
strlen(b"Return-Path\x00" as *const u8 as *const libc::c_char),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_colon_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
path = 0 as *mut mailimf_path;
r = mailimf_path_parse(message, length, &mut cur_token, &mut path);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_unstrict_crlf_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
return_path = mailimf_return_new(path);
if return_path.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
*result = return_path;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
mailimf_path_free(path);
}
}
}
return res;
}
unsafe fn mailimf_path_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_path,
) -> libc::c_int {
let mut current_block: u64;
let mut cur_token: size_t = 0;
let mut addr_spec: *mut libc::c_char = 0 as *mut libc::c_char;
let mut path: *mut mailimf_path = 0 as *mut mailimf_path;
let mut res: libc::c_int = 0;
let mut r: libc::c_int = 0;
cur_token = *indx;
addr_spec = 0 as *mut libc::c_char;
r = mailimf_cfws_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int && r != MAILIMF_ERROR_PARSE as libc::c_int {
res = r
} else {
r = mailimf_lower_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_addr_spec_parse(message, length, &mut cur_token, &mut addr_spec);
match r {
0 => {
current_block = 2370887241019905314;
}
1 => {
r = mailimf_cfws_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int
&& r != MAILIMF_ERROR_PARSE as libc::c_int
{
res = r;
current_block = 14973541214802992465;
} else {
current_block = 2370887241019905314;
}
}
_ => return r,
}
match current_block {
14973541214802992465 => {}
_ => {
r = mailimf_greater_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
path = mailimf_path_new(addr_spec);
if path.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int;
if addr_spec.is_null() {
mailimf_addr_spec_free(addr_spec);
}
} else {
*indx = cur_token;
*result = path;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
}
}
}
}
return res;
}
unsafe fn mailimf_keywords_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_keywords,
) -> libc::c_int {
let mut keywords: *mut mailimf_keywords = 0 as *mut mailimf_keywords;
let mut list: *mut clist = 0 as *mut clist;
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
r = mailimf_token_case_insensitive_len_parse(
message,
length,
&mut cur_token,
b"Keywords\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
strlen(b"Keywords\x00" as *const u8 as *const libc::c_char),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_colon_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_struct_list_parse(
message,
length,
&mut cur_token,
&mut list,
',' as i32 as libc::c_char,
::std::mem::transmute::<
Option<
unsafe fn(
_: *const libc::c_char,
_: size_t,
_: *mut size_t,
_: *mut *mut libc::c_char,
) -> libc::c_int,
>,
Option<
unsafe fn(
_: *const libc::c_char,
_: size_t,
_: *mut size_t,
_: *mut libc::c_void,
) -> libc::c_int,
>,
>(Some(mailimf_phrase_parse)),
::std::mem::transmute::<
Option<unsafe fn(_: *mut libc::c_char) -> ()>,
Option<unsafe fn(_: *mut libc::c_void) -> libc::c_int>,
>(Some(mailimf_phrase_free)),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_unstrict_crlf_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
keywords = mailimf_keywords_new(list);
if keywords.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
*result = keywords;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
clist_foreach(
list,
::std::mem::transmute::<
Option<unsafe fn(_: *mut libc::c_char) -> ()>,
clist_func,
>(Some(mailimf_phrase_free)),
0 as *mut libc::c_void,
);
clist_free(list);
}
}
}
return res;
}
unsafe fn mailimf_comments_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_comments,
) -> libc::c_int {
let mut comments: *mut mailimf_comments = 0 as *mut mailimf_comments;
let mut value: *mut libc::c_char = 0 as *mut libc::c_char;
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
r = mailimf_token_case_insensitive_len_parse(
message,
length,
&mut cur_token,
b"Comments\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
strlen(b"Comments\x00" as *const u8 as *const libc::c_char),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_colon_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_unstructured_parse(message, length, &mut cur_token, &mut value);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_unstrict_crlf_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
comments = mailimf_comments_new(value);
if comments.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
*result = comments;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
mailimf_unstructured_free(value);
}
}
}
return res;
}
unsafe fn mailimf_subject_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_subject,
) -> libc::c_int {
let mut subject: *mut mailimf_subject = 0 as *mut mailimf_subject;
let mut value: *mut libc::c_char = 0 as *mut libc::c_char;
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
r = mailimf_token_case_insensitive_len_parse(
message,
length,
&mut cur_token,
b"Subject\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
strlen(b"Subject\x00" as *const u8 as *const libc::c_char),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_colon_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_unstructured_parse(message, length, &mut cur_token, &mut value);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_unstrict_crlf_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
subject = mailimf_subject_new(value);
if subject.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
*result = subject;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
mailimf_unstructured_free(value);
}
}
}
return res;
}
/* exported for IMAP */
pub unsafe fn mailimf_references_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_references,
) -> libc::c_int {
let mut references: *mut mailimf_references = 0 as *mut mailimf_references;
let mut cur_token: size_t = 0;
let mut msg_id_list: *mut clist = 0 as *mut clist;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
r = mailimf_token_case_insensitive_len_parse(
message,
length,
&mut cur_token,
b"References\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
strlen(b"References\x00" as *const u8 as *const libc::c_char),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_colon_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_msg_id_list_parse(message, length, &mut cur_token, &mut msg_id_list);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_unstrict_crlf_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
references = mailimf_references_new(msg_id_list);
if references.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
*result = references;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
clist_foreach(
msg_id_list,
::std::mem::transmute::<
Option<unsafe fn(_: *mut libc::c_char) -> ()>,
clist_func,
>(Some(mailimf_msg_id_free)),
0 as *mut libc::c_void,
);
clist_free(msg_id_list);
}
}
}
return res;
}
pub unsafe fn mailimf_msg_id_list_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut clist,
) -> libc::c_int {
return mailimf_struct_multiple_parse(
message,
length,
indx,
result,
::std::mem::transmute::<
Option<
unsafe fn(
_: *const libc::c_char,
_: size_t,
_: *mut size_t,
_: *mut *mut libc::c_char,
) -> libc::c_int,
>,
Option<
unsafe fn(
_: *const libc::c_char,
_: size_t,
_: *mut size_t,
_: *mut libc::c_void,
) -> libc::c_int,
>,
>(Some(mailimf_unstrict_msg_id_parse)),
::std::mem::transmute::<
Option<unsafe fn(_: *mut libc::c_char) -> ()>,
Option<unsafe fn(_: *mut libc::c_void) -> libc::c_int>,
>(Some(mailimf_msg_id_free)),
);
}
unsafe fn mailimf_unstrict_msg_id_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut libc::c_char,
) -> libc::c_int {
let mut msgid: *mut libc::c_char = 0 as *mut libc::c_char;
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
cur_token = *indx;
r = mailimf_cfws_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int && r != MAILIMF_ERROR_PARSE as libc::c_int {
return r;
}
r = mailimf_parse_unwanted_msg_id(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailimf_msg_id_parse(message, length, &mut cur_token, &mut msgid);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
r = mailimf_parse_unwanted_msg_id(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
free(msgid as *mut libc::c_void);
return r;
}
*result = msgid;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailimf_parse_unwanted_msg_id(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
let mut word: *mut libc::c_char = 0 as *mut libc::c_char;
let mut token_parsed: libc::c_int = 0;
cur_token = *indx;
token_parsed = 1i32;
while 0 != token_parsed {
token_parsed = 0i32;
r = mailimf_word_parse(message, length, &mut cur_token, &mut word);
if r == MAILIMF_NO_ERROR as libc::c_int {
mailimf_word_free(word);
token_parsed = 1i32
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
} else {
return r;
}
r = mailimf_semi_colon_parse(message, length, &mut cur_token);
if r == MAILIMF_NO_ERROR as libc::c_int {
token_parsed = 1i32
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
} else {
return r;
}
r = mailimf_comma_parse(message, length, &mut cur_token);
if r == MAILIMF_NO_ERROR as libc::c_int {
token_parsed = 1i32
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
} else {
return r;
}
r = mailimf_plus_parse(message, length, &mut cur_token);
if r == MAILIMF_NO_ERROR as libc::c_int {
token_parsed = 1i32
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
} else {
return r;
}
r = mailimf_colon_parse(message, length, &mut cur_token);
if r == MAILIMF_NO_ERROR as libc::c_int {
token_parsed = 1i32
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
} else {
return r;
}
r = mailimf_point_parse(message, length, &mut cur_token);
if r == MAILIMF_NO_ERROR as libc::c_int {
token_parsed = 1i32
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
} else {
return r;
}
r = mailimf_at_sign_parse(message, length, &mut cur_token);
if r == MAILIMF_NO_ERROR as libc::c_int {
token_parsed = 1i32
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
} else {
return r;
}
}
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn mailimf_at_sign_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
) -> libc::c_int {
return mailimf_unstrict_char_parse(message, length, indx, '@' as i32 as libc::c_char);
}
unsafe fn mailimf_point_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
) -> libc::c_int {
return mailimf_unstrict_char_parse(message, length, indx, '.' as i32 as libc::c_char);
}
pub unsafe fn mailimf_word_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut libc::c_char,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut word: *mut libc::c_char = 0 as *mut libc::c_char;
let mut r: libc::c_int = 0;
cur_token = *indx;
r = mailimf_atom_parse(message, length, &mut cur_token, &mut word);
if r == MAILIMF_ERROR_PARSE as libc::c_int {
r = mailimf_quoted_string_parse(message, length, &mut cur_token, &mut word)
}
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
*result = word;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
pub unsafe fn mailimf_quoted_string_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut libc::c_char,
) -> libc::c_int {
let mut current_block: u64;
let mut cur_token: size_t = 0;
let mut gstr: *mut MMAPString = 0 as *mut MMAPString;
let mut ch: libc::c_char = 0;
let mut str: *mut libc::c_char = 0 as *mut libc::c_char;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
r = mailimf_cfws_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int && r != MAILIMF_ERROR_PARSE as libc::c_int {
res = r
} else {
r = mailimf_dquote_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
gstr = mmap_string_new(b"\x00" as *const u8 as *const libc::c_char);
if gstr.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
loop {
r = mailimf_fws_parse(message, length, &mut cur_token);
if r == MAILIMF_NO_ERROR as libc::c_int {
if mmap_string_append_c(gstr, ' ' as i32 as libc::c_char).is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int;
current_block = 14861901777624095282;
break;
}
} else if r != MAILIMF_ERROR_PARSE as libc::c_int {
res = r;
current_block = 14861901777624095282;
break;
}
r = mailimf_qcontent_parse(message, length, &mut cur_token, &mut ch);
if r == MAILIMF_NO_ERROR as libc::c_int {
if !mmap_string_append_c(gstr, ch).is_null() {
continue;
}
res = MAILIMF_ERROR_MEMORY as libc::c_int;
current_block = 14861901777624095282;
break;
} else {
if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 5494826135382683477;
break;
}
res = r;
current_block = 14861901777624095282;
break;
}
}
match current_block {
5494826135382683477 => {
r = mailimf_dquote_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
str = strdup((*gstr).str_0);
if str.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
mmap_string_free(gstr);
*indx = cur_token;
*result = str;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
}
_ => {}
}
mmap_string_free(gstr);
}
}
}
return res;
}
pub unsafe fn mailimf_atom_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut libc::c_char,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
let mut atom: *mut libc::c_char = 0 as *mut libc::c_char;
let mut end: size_t = 0;
cur_token = *indx;
r = mailimf_cfws_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int && r != MAILIMF_ERROR_PARSE as libc::c_int {
res = r
} else {
end = cur_token;
if end >= length {
res = MAILIMF_ERROR_PARSE as libc::c_int
} else {
while 0 != is_atext(*message.offset(end as isize)) {
end = end.wrapping_add(1);
if end >= length {
break;
}
}
if end == cur_token {
res = MAILIMF_ERROR_PARSE as libc::c_int
} else {
atom = malloc(
end.wrapping_sub(cur_token)
.wrapping_add(1i32 as libc::size_t),
) as *mut libc::c_char;
if atom.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
strncpy(
atom,
message.offset(cur_token as isize),
end.wrapping_sub(cur_token),
);
*atom.offset(end.wrapping_sub(cur_token) as isize) =
'\u{0}' as i32 as libc::c_char;
cur_token = end;
*indx = cur_token;
*result = atom;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
}
}
return res;
}
unsafe fn mailimf_struct_multiple_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut clist,
mut parser: Option<
unsafe fn(
_: *const libc::c_char,
_: size_t,
_: *mut size_t,
_: *mut libc::c_void,
) -> libc::c_int,
>,
mut destructor: Option<unsafe fn(_: *mut libc::c_void) -> libc::c_int>,
) -> libc::c_int {
let mut current_block: u64;
let mut struct_list: *mut clist = 0 as *mut clist;
let mut cur_token: size_t = 0;
let mut value: *mut libc::c_void = 0 as *mut libc::c_void;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
r = parser.expect("non-null function pointer")(
message,
length,
&mut cur_token,
&mut value as *mut *mut libc::c_void as *mut libc::c_void,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
struct_list = clist_new();
if struct_list.is_null() {
destructor.expect("non-null function pointer")(value);
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
r = clist_insert_after(struct_list, (*struct_list).last, value);
if r < 0i32 {
destructor.expect("non-null function pointer")(value);
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
loop {
r = parser.expect("non-null function pointer")(
message,
length,
&mut cur_token,
&mut value as *mut *mut libc::c_void as *mut libc::c_void,
);
if r != MAILIMF_NO_ERROR as libc::c_int {
if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 11057878835866523405;
break;
}
res = r;
current_block = 8222683242185098763;
break;
} else {
r = clist_insert_after(struct_list, (*struct_list).last, value);
if !(r < 0i32) {
continue;
}
destructor.expect("non-null function pointer")(value);
res = MAILIMF_ERROR_MEMORY as libc::c_int;
current_block = 8222683242185098763;
break;
}
}
match current_block {
8222683242185098763 => {}
_ => {
*result = struct_list;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
}
clist_foreach(
struct_list,
::std::mem::transmute::<
Option<unsafe fn(_: *mut libc::c_void) -> libc::c_int>,
clist_func,
>(destructor),
0 as *mut libc::c_void,
);
clist_free(struct_list);
}
}
return res;
}
unsafe fn mailimf_in_reply_to_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_in_reply_to,
) -> libc::c_int {
let mut in_reply_to: *mut mailimf_in_reply_to = 0 as *mut mailimf_in_reply_to;
let mut cur_token: size_t = 0;
let mut msg_id_list: *mut clist = 0 as *mut clist;
let mut res: libc::c_int = 0;
let mut r: libc::c_int = 0;
cur_token = *indx;
r = mailimf_token_case_insensitive_len_parse(
message,
length,
&mut cur_token,
b"In-Reply-To\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
strlen(b"In-Reply-To\x00" as *const u8 as *const libc::c_char),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_colon_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_msg_id_list_parse(message, length, &mut cur_token, &mut msg_id_list);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_unstrict_crlf_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
in_reply_to = mailimf_in_reply_to_new(msg_id_list);
if in_reply_to.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
*result = in_reply_to;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
clist_foreach(
msg_id_list,
::std::mem::transmute::<
Option<unsafe fn(_: *mut libc::c_char) -> ()>,
clist_func,
>(Some(mailimf_msg_id_free)),
0 as *mut libc::c_void,
);
clist_free(msg_id_list);
}
}
}
return res;
}
unsafe fn mailimf_message_id_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_message_id,
) -> libc::c_int {
let mut value: *mut libc::c_char = 0 as *mut libc::c_char;
let mut cur_token: size_t = 0;
let mut message_id: *mut mailimf_message_id = 0 as *mut mailimf_message_id;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
r = mailimf_token_case_insensitive_len_parse(
message,
length,
&mut cur_token,
b"Message-ID\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
strlen(b"Message-ID\x00" as *const u8 as *const libc::c_char),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_colon_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_msg_id_parse(message, length, &mut cur_token, &mut value);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_unstrict_crlf_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
message_id = mailimf_message_id_new(value);
if message_id.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
*result = message_id;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
mailimf_msg_id_free(value);
}
}
}
return res;
}
unsafe fn mailimf_bcc_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_bcc,
) -> libc::c_int {
let mut current_block: u64;
let mut addr_list: *mut mailimf_address_list = 0 as *mut mailimf_address_list;
let mut bcc: *mut mailimf_bcc = 0 as *mut mailimf_bcc;
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
addr_list = 0 as *mut mailimf_address_list;
r = mailimf_token_case_insensitive_len_parse(
message,
length,
&mut cur_token,
b"Bcc\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
strlen(b"Bcc\x00" as *const u8 as *const libc::c_char),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_colon_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_address_list_parse(message, length, &mut cur_token, &mut addr_list);
match r {
0 => {
/* do nothing */
current_block = 2838571290723028321;
}
1 => {
r = mailimf_cfws_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int
&& r != MAILIMF_ERROR_PARSE as libc::c_int
{
res = r;
current_block = 15260376711225273221;
} else {
current_block = 2838571290723028321;
}
}
_ => {
res = r;
current_block = 15260376711225273221;
}
}
match current_block {
15260376711225273221 => {}
_ => {
r = mailimf_unstrict_crlf_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
bcc = mailimf_bcc_new(addr_list);
if bcc.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
*result = bcc;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
}
}
}
}
if !addr_list.is_null() {
mailimf_address_list_free(addr_list);
}
return res;
}
unsafe fn mailimf_cc_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_cc,
) -> libc::c_int {
let mut addr_list: *mut mailimf_address_list = 0 as *mut mailimf_address_list;
let mut cc: *mut mailimf_cc = 0 as *mut mailimf_cc;
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
r = mailimf_token_case_insensitive_len_parse(
message,
length,
&mut cur_token,
b"Cc\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
strlen(b"Cc\x00" as *const u8 as *const libc::c_char),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_colon_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_address_list_parse(message, length, &mut cur_token, &mut addr_list);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_unstrict_crlf_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
cc = mailimf_cc_new(addr_list);
if cc.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
*result = cc;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
mailimf_address_list_free(addr_list);
}
}
}
return res;
}
unsafe fn mailimf_to_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_to,
) -> libc::c_int {
let mut addr_list: *mut mailimf_address_list = 0 as *mut mailimf_address_list;
let mut to: *mut mailimf_to = 0 as *mut mailimf_to;
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
r = mailimf_token_case_insensitive_len_parse(
message,
length,
&mut cur_token,
b"To\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
strlen(b"To\x00" as *const u8 as *const libc::c_char),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_colon_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_address_list_parse(message, length, &mut cur_token, &mut addr_list);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_unstrict_crlf_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
to = mailimf_to_new(addr_list);
if to.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
*result = to;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
mailimf_address_list_free(addr_list);
}
}
}
return res;
}
unsafe fn mailimf_reply_to_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_reply_to,
) -> libc::c_int {
let mut addr_list: *mut mailimf_address_list = 0 as *mut mailimf_address_list;
let mut reply_to: *mut mailimf_reply_to = 0 as *mut mailimf_reply_to;
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
r = mailimf_token_case_insensitive_len_parse(
message,
length,
&mut cur_token,
b"Reply-To\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
strlen(b"Reply-To\x00" as *const u8 as *const libc::c_char),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_colon_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_address_list_parse(message, length, &mut cur_token, &mut addr_list);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_unstrict_crlf_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
reply_to = mailimf_reply_to_new(addr_list);
if reply_to.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
*result = reply_to;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
mailimf_address_list_free(addr_list);
}
}
}
return res;
}
unsafe fn mailimf_sender_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_sender,
) -> libc::c_int {
let mut mb: *mut mailimf_mailbox = 0 as *mut mailimf_mailbox;
let mut sender: *mut mailimf_sender = 0 as *mut mailimf_sender;
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
r = mailimf_token_case_insensitive_len_parse(
message,
length,
&mut cur_token,
b"Sender\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
strlen(b"Sender\x00" as *const u8 as *const libc::c_char),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_colon_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_mailbox_parse(message, length, &mut cur_token, &mut mb);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_unstrict_crlf_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
sender = mailimf_sender_new(mb);
if sender.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
*result = sender;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
mailimf_mailbox_free(mb);
}
}
}
return res;
}
unsafe fn mailimf_from_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_from,
) -> libc::c_int {
let mut mb_list: *mut mailimf_mailbox_list = 0 as *mut mailimf_mailbox_list;
let mut from: *mut mailimf_from = 0 as *mut mailimf_from;
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
r = mailimf_token_case_insensitive_len_parse(
message,
length,
&mut cur_token,
b"From\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
strlen(b"From\x00" as *const u8 as *const libc::c_char),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_colon_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_mailbox_list_parse(message, length, &mut cur_token, &mut mb_list);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_unstrict_crlf_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
from = mailimf_from_new(mb_list);
if from.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
*result = from;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
mailimf_mailbox_list_free(mb_list);
}
}
}
return res;
}
unsafe fn mailimf_orig_date_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_orig_date,
) -> libc::c_int {
let mut date_time: *mut mailimf_date_time = 0 as *mut mailimf_date_time;
let mut orig_date: *mut mailimf_orig_date = 0 as *mut mailimf_orig_date;
let mut cur_token: size_t = 0;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
r = mailimf_token_case_insensitive_len_parse(
message,
length,
&mut cur_token,
b"Date:\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
strlen(b"Date:\x00" as *const u8 as *const libc::c_char),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_date_time_parse(message, length, &mut cur_token, &mut date_time);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_ignore_unstructured_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
r = mailimf_unstrict_crlf_parse(message, length, &mut cur_token);
if r != MAILIMF_NO_ERROR as libc::c_int {
res = r
} else {
orig_date = mailimf_orig_date_new(date_time);
if orig_date.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
*result = orig_date;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
}
mailimf_date_time_free(date_time);
}
}
return res;
}
unsafe fn mailimf_ignore_unstructured_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
) -> libc::c_int {
let mut cur_token: size_t = 0;
let mut state: libc::c_int = 0;
let mut terminal: size_t = 0;
cur_token = *indx;
state = UNSTRUCTURED_START as libc::c_int;
terminal = cur_token;
while state != UNSTRUCTURED_OUT as libc::c_int {
match state {
0 => {
if cur_token >= length {
return MAILIMF_ERROR_PARSE as libc::c_int;
}
terminal = cur_token;
match *message.offset(cur_token as isize) as libc::c_int {
13 => state = UNSTRUCTURED_CR as libc::c_int,
10 => state = UNSTRUCTURED_LF as libc::c_int,
_ => state = UNSTRUCTURED_START as libc::c_int,
}
}
1 => {
if cur_token >= length {
return MAILIMF_ERROR_PARSE as libc::c_int;
}
match *message.offset(cur_token as isize) as libc::c_int {
10 => state = UNSTRUCTURED_LF as libc::c_int,
_ => state = UNSTRUCTURED_START as libc::c_int,
}
}
2 => {
if cur_token >= length {
state = UNSTRUCTURED_OUT as libc::c_int
} else {
match *message.offset(cur_token as isize) as libc::c_int {
9 | 32 => state = UNSTRUCTURED_WSP as libc::c_int,
_ => state = UNSTRUCTURED_OUT as libc::c_int,
}
}
}
3 => {
if cur_token >= length {
return MAILIMF_ERROR_PARSE as libc::c_int;
}
match *message.offset(cur_token as isize) as libc::c_int {
13 => state = UNSTRUCTURED_CR as libc::c_int,
10 => state = UNSTRUCTURED_LF as libc::c_int,
_ => state = UNSTRUCTURED_START as libc::c_int,
}
}
_ => {}
}
cur_token = cur_token.wrapping_add(1)
}
*indx = terminal;
return MAILIMF_NO_ERROR as libc::c_int;
}
unsafe fn guess_header_type(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: size_t,
) -> libc::c_int {
let mut state: libc::c_int = 0;
let mut r: libc::c_int = 0;
state = HEADER_START as libc::c_int;
loop {
if indx >= length {
return MAILIMF_FIELD_NONE as libc::c_int;
}
match state {
0 => {
match toupper(*message.offset(indx as isize) as libc::c_uchar as libc::c_int)
as libc::c_char as libc::c_int
{
66 => return MAILIMF_FIELD_BCC as libc::c_int,
67 => state = HEADER_C as libc::c_int,
68 => return MAILIMF_FIELD_ORIG_DATE as libc::c_int,
70 => return MAILIMF_FIELD_FROM as libc::c_int,
73 => return MAILIMF_FIELD_IN_REPLY_TO as libc::c_int,
75 => return MAILIMF_FIELD_KEYWORDS as libc::c_int,
77 => return MAILIMF_FIELD_MESSAGE_ID as libc::c_int,
82 => state = HEADER_R as libc::c_int,
84 => return MAILIMF_FIELD_TO as libc::c_int,
83 => state = HEADER_S as libc::c_int,
_ => return MAILIMF_FIELD_NONE as libc::c_int,
}
}
1 => {
match toupper(*message.offset(indx as isize) as libc::c_uchar as libc::c_int)
as libc::c_char as libc::c_int
{
79 => return MAILIMF_FIELD_COMMENTS as libc::c_int,
67 => return MAILIMF_FIELD_CC as libc::c_int,
_ => return MAILIMF_FIELD_NONE as libc::c_int,
}
}
2 => {
match toupper(*message.offset(indx as isize) as libc::c_uchar as libc::c_int)
as libc::c_char as libc::c_int
{
69 => state = HEADER_RE as libc::c_int,
_ => return MAILIMF_FIELD_NONE as libc::c_int,
}
}
3 => {
match toupper(*message.offset(indx as isize) as libc::c_uchar as libc::c_int)
as libc::c_char as libc::c_int
{
70 => return MAILIMF_FIELD_REFERENCES as libc::c_int,
80 => return MAILIMF_FIELD_REPLY_TO as libc::c_int,
83 => state = HEADER_RES as libc::c_int,
84 => return MAILIMF_FIELD_RETURN_PATH as libc::c_int,
_ => return MAILIMF_FIELD_NONE as libc::c_int,
}
}
4 => {
match toupper(*message.offset(indx as isize) as libc::c_uchar as libc::c_int)
as libc::c_char as libc::c_int
{
69 => return MAILIMF_FIELD_SENDER as libc::c_int,
85 => return MAILIMF_FIELD_SUBJECT as libc::c_int,
_ => return MAILIMF_FIELD_NONE as libc::c_int,
}
}
5 => {
r = mailimf_token_case_insensitive_len_parse(
message,
length,
&mut indx,
b"ent-\x00" as *const u8 as *const libc::c_char as *mut libc::c_char,
strlen(b"ent-\x00" as *const u8 as *const libc::c_char),
);
if r != MAILIMF_NO_ERROR as libc::c_int {
return MAILIMF_FIELD_NONE as libc::c_int;
}
if indx >= length {
return MAILIMF_FIELD_NONE as libc::c_int;
}
match toupper(*message.offset(indx as isize) as libc::c_uchar as libc::c_int)
as libc::c_char as libc::c_int
{
68 => return MAILIMF_FIELD_RESENT_DATE as libc::c_int,
70 => return MAILIMF_FIELD_RESENT_FROM as libc::c_int,
83 => return MAILIMF_FIELD_RESENT_SENDER as libc::c_int,
84 => return MAILIMF_FIELD_RESENT_TO as libc::c_int,
67 => return MAILIMF_FIELD_RESENT_CC as libc::c_int,
66 => return MAILIMF_FIELD_RESENT_BCC as libc::c_int,
77 => return MAILIMF_FIELD_RESENT_MSG_ID as libc::c_int,
_ => return MAILIMF_FIELD_NONE as libc::c_int,
}
}
_ => {}
}
indx = indx.wrapping_add(1)
}
}
/*
mailimf_envelope_fields_parse will parse the given fields (Date,
From, Sender, Reply-To, To, Cc, Bcc, Message-ID, In-Reply-To,
References and Subject)
@param message this is a string containing the header fields
@param length this is the size of the given string
@param indx this is a pointer to the start of the header fields in
the given string, (* indx) is modified to point at the end
of the parsed data
@param result the result of the parse operation is stored in
(* result)
@return MAILIMF_NO_ERROR on success, MAILIMF_ERROR_XXX on error
*/
pub unsafe fn mailimf_envelope_fields_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_fields,
) -> libc::c_int {
let mut current_block: u64;
let mut cur_token: size_t = 0;
let mut list: *mut clist = 0 as *mut clist;
let mut fields: *mut mailimf_fields = 0 as *mut mailimf_fields;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
list = clist_new();
if list.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
loop {
let mut elt: *mut mailimf_field = 0 as *mut mailimf_field;
r = mailimf_envelope_field_parse(message, length, &mut cur_token, &mut elt);
if r == MAILIMF_NO_ERROR as libc::c_int {
r = clist_insert_after(list, (*list).last, elt as *mut libc::c_void);
if !(r < 0i32) {
continue;
}
res = MAILIMF_ERROR_MEMORY as libc::c_int;
current_block = 894413572976700158;
break;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
r = mailimf_ignore_field_parse(message, length, &mut cur_token);
if r == MAILIMF_NO_ERROR as libc::c_int {
continue;
}
/* do nothing */
if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 2719512138335094285;
break;
}
res = r;
current_block = 894413572976700158;
break;
} else {
res = r;
current_block = 894413572976700158;
break;
}
}
match current_block {
2719512138335094285 => {
fields = mailimf_fields_new(list);
if fields.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int
} else {
*result = fields;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
_ => {}
}
if !list.is_null() {
clist_foreach(
list,
::std::mem::transmute::<Option<unsafe fn(_: *mut mailimf_field) -> ()>, clist_func>(
Some(mailimf_field_free),
),
0 as *mut libc::c_void,
);
clist_free(list);
}
}
return res;
}
/*
mailimf_ignore_field_parse will skip the given field
@param message this is a string containing the header field
@param length this is the size of the given string
@param indx this is a pointer to the start of the header field in
the given string, (* indx) is modified to point at the end
of the parsed data
@return MAILIMF_NO_ERROR on success, MAILIMF_ERROR_XXX on error
*/
pub unsafe fn mailimf_ignore_field_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
) -> libc::c_int {
let mut has_field: libc::c_int = 0;
let mut cur_token: size_t = 0;
let mut state: libc::c_int = 0;
let mut terminal: size_t = 0;
has_field = 0i32;
cur_token = *indx;
terminal = cur_token;
state = UNSTRUCTURED_START as libc::c_int;
if cur_token >= length {
return MAILIMF_ERROR_PARSE as libc::c_int;
}
match *message.offset(cur_token as isize) as libc::c_int {
13 => return MAILIMF_ERROR_PARSE as libc::c_int,
10 => return MAILIMF_ERROR_PARSE as libc::c_int,
_ => {}
}
while state != UNSTRUCTURED_OUT as libc::c_int {
match state {
0 => {
if cur_token >= length {
return MAILIMF_ERROR_PARSE as libc::c_int;
}
match *message.offset(cur_token as isize) as libc::c_int {
13 => state = UNSTRUCTURED_CR as libc::c_int,
10 => state = UNSTRUCTURED_LF as libc::c_int,
58 => {
has_field = 1i32;
state = UNSTRUCTURED_START as libc::c_int
}
_ => state = UNSTRUCTURED_START as libc::c_int,
}
}
1 => {
if cur_token >= length {
return MAILIMF_ERROR_PARSE as libc::c_int;
}
match *message.offset(cur_token as isize) as libc::c_int {
10 => state = UNSTRUCTURED_LF as libc::c_int,
58 => {
has_field = 1i32;
state = UNSTRUCTURED_START as libc::c_int
}
_ => state = UNSTRUCTURED_START as libc::c_int,
}
}
2 => {
if cur_token >= length {
terminal = cur_token;
state = UNSTRUCTURED_OUT as libc::c_int
} else {
match *message.offset(cur_token as isize) as libc::c_int {
9 | 32 => state = UNSTRUCTURED_WSP as libc::c_int,
_ => {
terminal = cur_token;
state = UNSTRUCTURED_OUT as libc::c_int
}
}
}
}
3 => {
if cur_token >= length {
return MAILIMF_ERROR_PARSE as libc::c_int;
}
match *message.offset(cur_token as isize) as libc::c_int {
13 => state = UNSTRUCTURED_CR as libc::c_int,
10 => state = UNSTRUCTURED_LF as libc::c_int,
58 => {
has_field = 1i32;
state = UNSTRUCTURED_START as libc::c_int
}
_ => state = UNSTRUCTURED_START as libc::c_int,
}
}
_ => {}
}
cur_token = cur_token.wrapping_add(1)
}
if 0 == has_field {
return MAILIMF_ERROR_PARSE as libc::c_int;
}
*indx = terminal;
return MAILIMF_NO_ERROR as libc::c_int;
}
/*
static int mailimf_ftext_parse(const char * message, size_t length,
size_t * indx, gchar * result)
{
return mailimf_typed_text_parse(message, length, indx, result, is_ftext);
}
*/
unsafe fn mailimf_envelope_field_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_field,
) -> libc::c_int {
let mut current_block: u64;
let mut cur_token: size_t = 0;
let mut type_0: libc::c_int = 0;
let mut orig_date: *mut mailimf_orig_date = 0 as *mut mailimf_orig_date;
let mut from: *mut mailimf_from = 0 as *mut mailimf_from;
let mut sender: *mut mailimf_sender = 0 as *mut mailimf_sender;
let mut reply_to: *mut mailimf_reply_to = 0 as *mut mailimf_reply_to;
let mut to: *mut mailimf_to = 0 as *mut mailimf_to;
let mut cc: *mut mailimf_cc = 0 as *mut mailimf_cc;
let mut bcc: *mut mailimf_bcc = 0 as *mut mailimf_bcc;
let mut message_id: *mut mailimf_message_id = 0 as *mut mailimf_message_id;
let mut in_reply_to: *mut mailimf_in_reply_to = 0 as *mut mailimf_in_reply_to;
let mut references: *mut mailimf_references = 0 as *mut mailimf_references;
let mut subject: *mut mailimf_subject = 0 as *mut mailimf_subject;
let mut optional_field: *mut mailimf_optional_field = 0 as *mut mailimf_optional_field;
let mut field: *mut mailimf_field = 0 as *mut mailimf_field;
let mut guessed_type: libc::c_int = 0;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
orig_date = 0 as *mut mailimf_orig_date;
from = 0 as *mut mailimf_from;
sender = 0 as *mut mailimf_sender;
reply_to = 0 as *mut mailimf_reply_to;
to = 0 as *mut mailimf_to;
cc = 0 as *mut mailimf_cc;
bcc = 0 as *mut mailimf_bcc;
message_id = 0 as *mut mailimf_message_id;
in_reply_to = 0 as *mut mailimf_in_reply_to;
references = 0 as *mut mailimf_references;
subject = 0 as *mut mailimf_subject;
optional_field = 0 as *mut mailimf_optional_field;
guessed_type = guess_header_type(message, length, cur_token);
type_0 = MAILIMF_FIELD_NONE as libc::c_int;
match guessed_type {
9 => {
r = mailimf_orig_date_parse(message, length, &mut cur_token, &mut orig_date);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 4488496028633655612;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 4488496028633655612;
} else {
/* do nothing */
res = r;
current_block = 15605017197726313499;
}
}
10 => {
r = mailimf_from_parse(message, length, &mut cur_token, &mut from);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 4488496028633655612;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 4488496028633655612;
} else {
/* do nothing */
res = r;
current_block = 15605017197726313499;
}
}
11 => {
r = mailimf_sender_parse(message, length, &mut cur_token, &mut sender);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 4488496028633655612;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 4488496028633655612;
} else {
/* do nothing */
res = r;
current_block = 15605017197726313499;
}
}
12 => {
r = mailimf_reply_to_parse(message, length, &mut cur_token, &mut reply_to);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 4488496028633655612;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 4488496028633655612;
} else {
/* do nothing */
res = r;
current_block = 15605017197726313499;
}
}
13 => {
r = mailimf_to_parse(message, length, &mut cur_token, &mut to);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 4488496028633655612;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 4488496028633655612;
} else {
/* do nothing */
res = r;
current_block = 15605017197726313499;
}
}
14 => {
r = mailimf_cc_parse(message, length, &mut cur_token, &mut cc);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 4488496028633655612;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 4488496028633655612;
} else {
/* do nothing */
res = r;
current_block = 15605017197726313499;
}
}
15 => {
r = mailimf_bcc_parse(message, length, &mut cur_token, &mut bcc);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 4488496028633655612;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 4488496028633655612;
} else {
/* do nothing */
res = r;
current_block = 15605017197726313499;
}
}
16 => {
r = mailimf_message_id_parse(message, length, &mut cur_token, &mut message_id);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 4488496028633655612;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 4488496028633655612;
} else {
/* do nothing */
res = r;
current_block = 15605017197726313499;
}
}
17 => {
r = mailimf_in_reply_to_parse(message, length, &mut cur_token, &mut in_reply_to);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 4488496028633655612;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 4488496028633655612;
} else {
/* do nothing */
res = r;
current_block = 15605017197726313499;
}
}
18 => {
r = mailimf_references_parse(message, length, &mut cur_token, &mut references);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 4488496028633655612;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 4488496028633655612;
} else {
/* do nothing */
res = r;
current_block = 15605017197726313499;
}
}
19 => {
r = mailimf_subject_parse(message, length, &mut cur_token, &mut subject);
if r == MAILIMF_NO_ERROR as libc::c_int {
type_0 = guessed_type;
current_block = 4488496028633655612;
} else if r == MAILIMF_ERROR_PARSE as libc::c_int {
current_block = 4488496028633655612;
} else {
/* do nothing */
res = r;
current_block = 15605017197726313499;
}
}
_ => {
current_block = 4488496028633655612;
}
}
match current_block {
4488496028633655612 => {
if type_0 == MAILIMF_FIELD_NONE as libc::c_int {
res = MAILIMF_ERROR_PARSE as libc::c_int
} else {
field = mailimf_field_new(
type_0,
0 as *mut mailimf_return,
0 as *mut mailimf_orig_date,
0 as *mut mailimf_from,
0 as *mut mailimf_sender,
0 as *mut mailimf_to,
0 as *mut mailimf_cc,
0 as *mut mailimf_bcc,
0 as *mut mailimf_message_id,
orig_date,
from,
sender,
reply_to,
to,
cc,
bcc,
message_id,
in_reply_to,
references,
subject,
0 as *mut mailimf_comments,
0 as *mut mailimf_keywords,
optional_field,
);
if field.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int;
if !orig_date.is_null() {
mailimf_orig_date_free(orig_date);
}
if !from.is_null() {
mailimf_from_free(from);
}
if !sender.is_null() {
mailimf_sender_free(sender);
}
if !reply_to.is_null() {
mailimf_reply_to_free(reply_to);
}
if !to.is_null() {
mailimf_to_free(to);
}
if !cc.is_null() {
mailimf_cc_free(cc);
}
if !bcc.is_null() {
mailimf_bcc_free(bcc);
}
if !message_id.is_null() {
mailimf_message_id_free(message_id);
}
if !in_reply_to.is_null() {
mailimf_in_reply_to_free(in_reply_to);
}
if !references.is_null() {
mailimf_references_free(references);
}
if !subject.is_null() {
mailimf_subject_free(subject);
}
if !optional_field.is_null() {
mailimf_optional_field_free(optional_field);
}
} else {
*result = field;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
}
_ => {}
}
return res;
}
/*
mailimf_envelope_fields will parse the given fields (Date,
From, Sender, Reply-To, To, Cc, Bcc, Message-ID, In-Reply-To,
References and Subject), other fields will be added as optional
fields.
@param message this is a string containing the header fields
@param length this is the size of the given string
@param indx this is a pointer to the start of the header fields in
the given string, (* indx) is modified to point at the end
of the parsed data
@param result the result of the parse operation is stored in
(* result)
@return MAILIMF_NO_ERROR on success, MAILIMF_ERROR_XXX on error
*/
pub unsafe fn mailimf_envelope_and_optional_fields_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_fields,
) -> libc::c_int {
let mut current_block: u64;
let mut cur_token: size_t = 0;
let mut list: *mut clist = 0 as *mut clist;
let mut fields: *mut mailimf_fields = 0 as *mut mailimf_fields;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
list = 0 as *mut clist;
r = mailimf_struct_multiple_parse(
message,
length,
&mut cur_token,
&mut list,
::std::mem::transmute::<
Option<
unsafe fn(
_: *const libc::c_char,
_: size_t,
_: *mut size_t,
_: *mut *mut mailimf_field,
) -> libc::c_int,
>,
Option<
unsafe fn(
_: *const libc::c_char,
_: size_t,
_: *mut size_t,
_: *mut libc::c_void,
) -> libc::c_int,
>,
>(Some(mailimf_envelope_or_optional_field_parse)),
::std::mem::transmute::<
Option<unsafe fn(_: *mut mailimf_field) -> ()>,
Option<unsafe fn(_: *mut libc::c_void) -> libc::c_int>,
>(Some(mailimf_field_free)),
);
match r {
0 => {
/* do nothing */
current_block = 11050875288958768710;
}
1 => {
list = clist_new();
if list.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int;
current_block = 7755940856643933760;
} else {
current_block = 11050875288958768710;
}
}
_ => {
res = r;
current_block = 7755940856643933760;
}
}
match current_block {
11050875288958768710 => {
fields = mailimf_fields_new(list);
if fields.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int;
if !list.is_null() {
clist_foreach(
list,
::std::mem::transmute::<
Option<unsafe fn(_: *mut mailimf_field) -> ()>,
clist_func,
>(Some(mailimf_field_free)),
0 as *mut libc::c_void,
);
clist_free(list);
}
} else {
*result = fields;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
_ => {}
}
return res;
}
unsafe fn mailimf_envelope_or_optional_field_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_field,
) -> libc::c_int {
let mut r: libc::c_int = 0;
let mut cur_token: size_t = 0;
let mut optional_field: *mut mailimf_optional_field = 0 as *mut mailimf_optional_field;
let mut field: *mut mailimf_field = 0 as *mut mailimf_field;
r = mailimf_envelope_field_parse(message, length, indx, result);
if r == MAILIMF_NO_ERROR as libc::c_int {
return MAILIMF_NO_ERROR as libc::c_int;
}
cur_token = *indx;
r = mailimf_optional_field_parse(message, length, &mut cur_token, &mut optional_field);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
field = mailimf_field_new(
MAILIMF_FIELD_OPTIONAL_FIELD as libc::c_int,
0 as *mut mailimf_return,
0 as *mut mailimf_orig_date,
0 as *mut mailimf_from,
0 as *mut mailimf_sender,
0 as *mut mailimf_to,
0 as *mut mailimf_cc,
0 as *mut mailimf_bcc,
0 as *mut mailimf_message_id,
0 as *mut mailimf_orig_date,
0 as *mut mailimf_from,
0 as *mut mailimf_sender,
0 as *mut mailimf_reply_to,
0 as *mut mailimf_to,
0 as *mut mailimf_cc,
0 as *mut mailimf_bcc,
0 as *mut mailimf_message_id,
0 as *mut mailimf_in_reply_to,
0 as *mut mailimf_references,
0 as *mut mailimf_subject,
0 as *mut mailimf_comments,
0 as *mut mailimf_keywords,
optional_field,
);
if field.is_null() {
mailimf_optional_field_free(optional_field);
return MAILIMF_ERROR_MEMORY as libc::c_int;
}
*result = field;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
/*
mailimf_envelope_fields will parse the given fields as optional
fields.
@param message this is a string containing the header fields
@param length this is the size of the given string
@param indx this is a pointer to the start of the header fields in
the given string, (* indx) is modified to point at the end
of the parsed data
@param result the result of the parse operation is stored in
(* result)
@return MAILIMF_NO_ERROR on success, MAILIMF_ERROR_XXX on error
*/
pub unsafe fn mailimf_optional_fields_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_fields,
) -> libc::c_int {
let mut current_block: u64;
let mut cur_token: size_t = 0;
let mut list: *mut clist = 0 as *mut clist;
let mut fields: *mut mailimf_fields = 0 as *mut mailimf_fields;
let mut r: libc::c_int = 0;
let mut res: libc::c_int = 0;
cur_token = *indx;
list = 0 as *mut clist;
r = mailimf_struct_multiple_parse(
message,
length,
&mut cur_token,
&mut list,
::std::mem::transmute::<
Option<
unsafe fn(
_: *const libc::c_char,
_: size_t,
_: *mut size_t,
_: *mut *mut mailimf_field,
) -> libc::c_int,
>,
Option<
unsafe fn(
_: *const libc::c_char,
_: size_t,
_: *mut size_t,
_: *mut libc::c_void,
) -> libc::c_int,
>,
>(Some(mailimf_only_optional_field_parse)),
::std::mem::transmute::<
Option<unsafe fn(_: *mut mailimf_field) -> ()>,
Option<unsafe fn(_: *mut libc::c_void) -> libc::c_int>,
>(Some(mailimf_field_free)),
);
match r {
0 => {
/* do nothing */
current_block = 11050875288958768710;
}
1 => {
list = clist_new();
if list.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int;
current_block = 4409055091581443388;
} else {
current_block = 11050875288958768710;
}
}
_ => {
res = r;
current_block = 4409055091581443388;
}
}
match current_block {
11050875288958768710 => {
fields = mailimf_fields_new(list);
if fields.is_null() {
res = MAILIMF_ERROR_MEMORY as libc::c_int;
if !list.is_null() {
clist_foreach(
list,
::std::mem::transmute::<
Option<unsafe fn(_: *mut mailimf_field) -> ()>,
clist_func,
>(Some(mailimf_field_free)),
0 as *mut libc::c_void,
);
clist_free(list);
}
} else {
*result = fields;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
}
_ => {}
}
return res;
}
unsafe fn mailimf_only_optional_field_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut mailimf_field,
) -> libc::c_int {
let mut r: libc::c_int = 0;
let mut cur_token: size_t = 0;
let mut optional_field: *mut mailimf_optional_field = 0 as *mut mailimf_optional_field;
let mut field: *mut mailimf_field = 0 as *mut mailimf_field;
cur_token = *indx;
r = mailimf_optional_field_parse(message, length, &mut cur_token, &mut optional_field);
if r != MAILIMF_NO_ERROR as libc::c_int {
return r;
}
field = mailimf_field_new(
MAILIMF_FIELD_OPTIONAL_FIELD as libc::c_int,
0 as *mut mailimf_return,
0 as *mut mailimf_orig_date,
0 as *mut mailimf_from,
0 as *mut mailimf_sender,
0 as *mut mailimf_to,
0 as *mut mailimf_cc,
0 as *mut mailimf_bcc,
0 as *mut mailimf_message_id,
0 as *mut mailimf_orig_date,
0 as *mut mailimf_from,
0 as *mut mailimf_sender,
0 as *mut mailimf_reply_to,
0 as *mut mailimf_to,
0 as *mut mailimf_cc,
0 as *mut mailimf_bcc,
0 as *mut mailimf_message_id,
0 as *mut mailimf_in_reply_to,
0 as *mut mailimf_references,
0 as *mut mailimf_subject,
0 as *mut mailimf_comments,
0 as *mut mailimf_keywords,
optional_field,
);
if field.is_null() {
mailimf_optional_field_free(optional_field);
return MAILIMF_ERROR_MEMORY as libc::c_int;
}
*result = field;
*indx = cur_token;
return MAILIMF_NO_ERROR as libc::c_int;
}
pub unsafe fn mailimf_custom_string_parse(
mut message: *const libc::c_char,
mut length: size_t,
mut indx: *mut size_t,
mut result: *mut *mut libc::c_char,
mut is_custom_char: Option<unsafe fn(_: libc::c_char) -> libc::c_int>,
) -> libc::c_int {
let mut begin: size_t = 0;
let mut end: size_t = 0;
let mut gstr: *mut libc::c_char = 0 as *mut libc::c_char;
begin = *indx;
end = begin;
if end >= length {
return MAILIMF_ERROR_PARSE as libc::c_int;
}
while 0 != is_custom_char.expect("non-null function pointer")(*message.offset(end as isize)) {
end = end.wrapping_add(1);
if end >= length {
break;
}
}
if end != begin {
gstr =
malloc(end.wrapping_sub(begin).wrapping_add(1i32 as libc::size_t)) as *mut libc::c_char;
if gstr.is_null() {
return MAILIMF_ERROR_MEMORY as libc::c_int;
}
strncpy(
gstr,
message.offset(begin as isize),
end.wrapping_sub(begin),
);
*gstr.offset(end.wrapping_sub(begin) as isize) = '\u{0}' as i32 as libc::c_char;
*indx = end;
*result = gstr;
return MAILIMF_NO_ERROR as libc::c_int;
} else {
return MAILIMF_ERROR_PARSE as libc::c_int;
};
}