Simplify dc_simplify_t implementation

- Replace dc_simplify_new and dc_simplify_unref with ::new()
- Move dc_simplify_simplify and dc_simplify_simplify_plain_text into impl
This commit is contained in:
Alexander Krotov
2019-07-25 20:25:59 +03:00
committed by holger krekel
parent 63ed5c4009
commit 2f204fd2aa
2 changed files with 57 additions and 70 deletions

View File

@@ -1150,7 +1150,7 @@ unsafe fn dc_mimeparser_add_single_part_if_known(
/* must not be free()'d */ /* must not be free()'d */
let mut decoded_data: *const libc::c_char = 0 as *const libc::c_char; let mut decoded_data: *const libc::c_char = 0 as *const libc::c_char;
let mut decoded_data_bytes = 0; let mut decoded_data_bytes = 0;
let mut simplifier: *mut dc_simplify_t = 0 as *mut dc_simplify_t; let mut simplifier: Option<dc_simplify_t> = None;
if !(mime.is_null() || (*mime).mm_data.mm_single.is_null()) { if !(mime.is_null() || (*mime).mm_data.mm_single.is_null()) {
mime_type = mailmime_get_mime_type(mime, &mut msg_type, &mut raw_mime); mime_type = mailmime_get_mime_type(mime, &mut msg_type, &mut raw_mime);
mime_data = (*mime).mm_data.mm_single; mime_data = (*mime).mm_data.mm_single;
@@ -1171,20 +1171,9 @@ unsafe fn dc_mimeparser_add_single_part_if_known(
/* no always error - but no data */ /* no always error - but no data */
match mime_type { match mime_type {
60 | 70 => { 60 | 70 => {
if simplifier.is_null() { if simplifier.is_none() {
simplifier = dc_simplify_new(); simplifier = Some(dc_simplify_t::new());
if simplifier.is_null() {
current_block = 8795901732489102124;
} else {
current_block = 13797916685926291137;
} }
} else {
current_block = 13797916685926291137;
}
// TODO match on enums /rtn
match current_block {
8795901732489102124 => {}
_ => {
/* get from `Content-Type: text/...; charset=utf-8`; must not be free()'d */ /* get from `Content-Type: text/...; charset=utf-8`; must not be free()'d */
let charset: *const libc::c_char = let charset: *const libc::c_char =
mailmime_content_charset_get((*mime).mm_content_type); mailmime_content_charset_get((*mime).mm_content_type);
@@ -1241,8 +1230,7 @@ unsafe fn dc_mimeparser_add_single_part_if_known(
as *mut mailimf_optional_field) as *mut mailimf_optional_field)
as libc::c_int; as libc::c_int;
let simplified_txt: *mut libc::c_char = let simplified_txt: *mut libc::c_char =
dc_simplify_simplify( simplifier.unwrap().simplify(
simplifier,
decoded_data, decoded_data,
decoded_data_bytes as libc::c_int, decoded_data_bytes as libc::c_int,
if mime_type == 70i32 { 1i32 } else { 0i32 }, if mime_type == 70i32 { 1i32 } else { 0i32 },
@@ -1264,15 +1252,13 @@ unsafe fn dc_mimeparser_add_single_part_if_known(
} else { } else {
free(simplified_txt as *mut libc::c_void); free(simplified_txt as *mut libc::c_void);
} }
if 0 != (*simplifier).is_forwarded { if 0 != simplifier.unwrap().is_forwarded {
(*mimeparser).is_forwarded = 1i32 (*mimeparser).is_forwarded = 1i32
} }
current_block = 10261677128829721533; current_block = 10261677128829721533;
} }
} }
} }
}
}
80 | 90 | 100 | 110 | 111 => { 80 | 90 | 100 | 110 | 111 => {
/* try to get file name from /* try to get file name from
`Content-Disposition: ... filename*=...` `Content-Disposition: ... filename*=...`
@@ -1449,7 +1435,6 @@ unsafe fn dc_mimeparser_add_single_part_if_known(
} }
} }
/* add object? (we do not add all objects, eg. signatures etc. are ignored) */ /* add object? (we do not add all objects, eg. signatures etc. are ignored) */
dc_simplify_unref(simplifier);
if !transfer_decoding_buffer.is_null() { if !transfer_decoding_buffer.is_null() {
mmap_string_unref(transfer_decoding_buffer); mmap_string_unref(transfer_decoding_buffer);
} }

View File

@@ -11,26 +11,17 @@ pub struct dc_simplify_t {
pub is_cut_at_end: libc::c_int, pub is_cut_at_end: libc::c_int,
} }
pub unsafe fn dc_simplify_new() -> *mut dc_simplify_t { impl dc_simplify_t {
let simplify: *mut dc_simplify_t; pub fn new() -> Self {
simplify = calloc(1, ::std::mem::size_of::<dc_simplify_t>()) as *mut dc_simplify_t; dc_simplify_t {
assert!(!simplify.is_null()); is_forwarded: 0,
is_cut_at_begin: 0,
simplify is_cut_at_end: 0,
}
} }
pub unsafe fn dc_simplify_unref(simplify: *mut dc_simplify_t) { pub unsafe fn simplify(
if simplify.is_null() { &mut self,
return;
}
free(simplify as *mut libc::c_void);
}
/* Simplify and normalise text: Remove quotes, signatures, unnecessary
lineends etc.
The data returned from Simplify() must be free()'d when no longer used, private */
pub unsafe fn dc_simplify_simplify(
mut simplify: *mut dc_simplify_t,
in_unterminated: *const libc::c_char, in_unterminated: *const libc::c_char,
in_bytes: libc::c_int, in_bytes: libc::c_int,
is_html: libc::c_int, is_html: libc::c_int,
@@ -39,12 +30,9 @@ pub unsafe fn dc_simplify_simplify(
/* create a copy of the given buffer */ /* create a copy of the given buffer */
let mut out: *mut libc::c_char; let mut out: *mut libc::c_char;
let mut temp: *mut libc::c_char; let mut temp: *mut libc::c_char;
if simplify.is_null() || in_unterminated.is_null() || in_bytes <= 0i32 { self.is_forwarded = 0i32;
return dc_strdup(b"\x00" as *const u8 as *const libc::c_char); self.is_cut_at_begin = 0i32;
} self.is_cut_at_end = 0i32;
(*simplify).is_forwarded = 0i32;
(*simplify).is_cut_at_begin = 0i32;
(*simplify).is_cut_at_end = 0i32;
out = strndup( out = strndup(
in_unterminated as *mut libc::c_char, in_unterminated as *mut libc::c_char,
in_bytes as libc::c_ulong, in_bytes as libc::c_ulong,
@@ -60,7 +48,7 @@ pub unsafe fn dc_simplify_simplify(
} }
} }
dc_remove_cr_chars(out); dc_remove_cr_chars(out);
temp = dc_simplify_simplify_plain_text(simplify, out, is_msgrmsg); temp = self.simplify_plain_text(out, is_msgrmsg);
if !temp.is_null() { if !temp.is_null() {
free(out as *mut libc::c_void); free(out as *mut libc::c_void);
out = temp out = temp
@@ -73,8 +61,8 @@ pub unsafe fn dc_simplify_simplify(
/** /**
* Simplify Plain Text * Simplify Plain Text
*/ */
unsafe fn dc_simplify_simplify_plain_text( unsafe fn simplify_plain_text(
mut simplify: *mut dc_simplify_t, &mut self,
buf_terminated: *const libc::c_char, buf_terminated: *const libc::c_char,
is_msgrmsg: libc::c_int, is_msgrmsg: libc::c_int,
) -> *mut libc::c_char { ) -> *mut libc::c_char {
@@ -105,7 +93,7 @@ unsafe fn dc_simplify_simplify_plain_text(
|| strcmp(line, b"----\x00" as *const u8 as *const libc::c_char) == 0i32 || strcmp(line, b"----\x00" as *const u8 as *const libc::c_char) == 0i32
{ {
footer_mark = 1i32; footer_mark = 1i32;
(*simplify).is_cut_at_end = 1i32 self.is_cut_at_end = 1i32
} }
if 0 != footer_mark { if 0 != footer_mark {
l_last = l - 1i32; l_last = l - 1i32;
@@ -129,7 +117,7 @@ unsafe fn dc_simplify_simplify_plain_text(
&& strncmp(line1, b"From: \x00" as *const u8 as *const libc::c_char, 6) == 0i32 && strncmp(line1, b"From: \x00" as *const u8 as *const libc::c_char, 6) == 0i32
&& *line2.offset(0isize) as libc::c_int == 0i32 && *line2.offset(0isize) as libc::c_int == 0i32
{ {
(*simplify).is_forwarded = 1i32; self.is_forwarded = 1i32;
l_first += 3i32 l_first += 3i32
} }
} }
@@ -143,7 +131,7 @@ unsafe fn dc_simplify_simplify_plain_text(
|| strncmp(line, b"~~~~~\x00" as *const u8 as *const libc::c_char, 5) == 0i32 || strncmp(line, b"~~~~~\x00" as *const u8 as *const libc::c_char, 5) == 0i32
{ {
l_last = l - 1i32; l_last = l - 1i32;
(*simplify).is_cut_at_end = 1i32; self.is_cut_at_end = 1i32;
/* done */ /* done */
break; break;
} else { } else {
@@ -164,9 +152,10 @@ unsafe fn dc_simplify_simplify_plain_text(
} }
if l_lastQuotedLine != -1i32 { if l_lastQuotedLine != -1i32 {
l_last = l_lastQuotedLine - 1i32; l_last = l_lastQuotedLine - 1i32;
(*simplify).is_cut_at_end = 1i32; self.is_cut_at_end = 1i32;
if l_last > 0i32 { if l_last > 0i32 {
if is_empty_line(carray_get(lines, l_last as libc::c_uint) as *mut libc::c_char) { if is_empty_line(carray_get(lines, l_last as libc::c_uint) as *mut libc::c_char)
{
l_last -= 1 l_last -= 1
} }
} }
@@ -187,7 +176,9 @@ unsafe fn dc_simplify_simplify_plain_text(
if is_plain_quote(line) { if is_plain_quote(line) {
l_lastQuotedLine_0 = l l_lastQuotedLine_0 = l
} else if !is_empty_line(line) { } else if !is_empty_line(line) {
if is_quoted_headline(line) && 0 == hasQuotedHeadline && l_lastQuotedLine_0 == -1i32 if is_quoted_headline(line)
&& 0 == hasQuotedHeadline
&& l_lastQuotedLine_0 == -1i32
{ {
hasQuotedHeadline = 1i32 hasQuotedHeadline = 1i32
} else { } else {
@@ -199,12 +190,12 @@ unsafe fn dc_simplify_simplify_plain_text(
} }
if l_lastQuotedLine_0 != -1i32 { if l_lastQuotedLine_0 != -1i32 {
l_first = l_lastQuotedLine_0 + 1i32; l_first = l_lastQuotedLine_0 + 1i32;
(*simplify).is_cut_at_begin = 1i32 self.is_cut_at_begin = 1i32
} }
} }
/* re-create buffer from the remaining lines */ /* re-create buffer from the remaining lines */
let mut ret = String::new(); let mut ret = String::new();
if 0 != (*simplify).is_cut_at_begin { if 0 != self.is_cut_at_begin {
ret += "[...]"; ret += "[...]";
} }
/* we write empty lines only in case and non-empty line follows */ /* we write empty lines only in case and non-empty line follows */
@@ -232,15 +223,30 @@ unsafe fn dc_simplify_simplify_plain_text(
} }
l += 1 l += 1
} }
if 0 != (*simplify).is_cut_at_end if 0 != self.is_cut_at_end && (0 == self.is_cut_at_begin || 0 != content_lines_added) {
&& (0 == (*simplify).is_cut_at_begin || 0 != content_lines_added)
{
ret += " [...]"; ret += " [...]";
} }
dc_free_splitted_lines(lines); dc_free_splitted_lines(lines);
to_cstring(ret) to_cstring(ret)
} }
}
/* Simplify and normalise text: Remove quotes, signatures, unnecessary
lineends etc.
The data returned from Simplify() must be free()'d when no longer used, private */
pub unsafe fn dc_simplify_simplify(
simplify: *mut dc_simplify_t,
in_unterminated: *const libc::c_char,
in_bytes: libc::c_int,
is_html: libc::c_int,
is_msgrmsg: libc::c_int,
) -> *mut libc::c_char {
if simplify.is_null() || in_unterminated.is_null() || in_bytes <= 0i32 {
return dc_strdup(b"\x00" as *const u8 as *const libc::c_char);
}
(*simplify).simplify(in_unterminated, in_bytes, is_html, is_msgrmsg)
}
/** /**
* Tools * Tools
@@ -290,11 +296,11 @@ mod tests {
#[test] #[test]
fn test_simplify_trim() { fn test_simplify_trim() {
unsafe { unsafe {
let simplify: *mut dc_simplify_t = dc_simplify_new(); let mut simplify = dc_simplify_t::new();
let html: *const libc::c_char = let html: *const libc::c_char =
b"\r\r\nline1<br>\r\n\r\n\r\rline2\n\r\x00" as *const u8 as *const libc::c_char; b"\r\r\nline1<br>\r\n\r\n\r\rline2\n\r\x00" as *const u8 as *const libc::c_char;
let plain: *mut libc::c_char = let plain: *mut libc::c_char =
dc_simplify_simplify(simplify, html, strlen(html) as libc::c_int, 1, 0); simplify.simplify(html, strlen(html) as libc::c_int, 1, 0);
assert_eq!( assert_eq!(
CStr::from_ptr(plain as *const libc::c_char) CStr::from_ptr(plain as *const libc::c_char)
@@ -304,18 +310,17 @@ mod tests {
); );
free(plain as *mut libc::c_void); free(plain as *mut libc::c_void);
dc_simplify_unref(simplify);
} }
} }
#[test] #[test]
fn test_simplify_parse_href() { fn test_simplify_parse_href() {
unsafe { unsafe {
let simplify: *mut dc_simplify_t = dc_simplify_new(); let mut simplify = dc_simplify_t::new();
let html: *const libc::c_char = let html: *const libc::c_char =
b"<a href=url>text</a\x00" as *const u8 as *const libc::c_char; b"<a href=url>text</a\x00" as *const u8 as *const libc::c_char;
let plain: *mut libc::c_char = let plain: *mut libc::c_char =
dc_simplify_simplify(simplify, html, strlen(html) as libc::c_int, 1, 0); simplify.simplify(html, strlen(html) as libc::c_int, 1, 0);
assert_eq!( assert_eq!(
CStr::from_ptr(plain as *const libc::c_char) CStr::from_ptr(plain as *const libc::c_char)
@@ -325,19 +330,18 @@ mod tests {
); );
free(plain as *mut libc::c_void); free(plain as *mut libc::c_void);
dc_simplify_unref(simplify);
} }
} }
#[test] #[test]
fn test_simplify_bold_text() { fn test_simplify_bold_text() {
unsafe { unsafe {
let simplify: *mut dc_simplify_t = dc_simplify_new(); let mut simplify = dc_simplify_t::new();
let html: *const libc::c_char = let html: *const libc::c_char =
b"<!DOCTYPE name [<!DOCTYPE ...>]><!-- comment -->text <b><?php echo ... ?>bold</b><![CDATA[<>]]>\x00" b"<!DOCTYPE name [<!DOCTYPE ...>]><!-- comment -->text <b><?php echo ... ?>bold</b><![CDATA[<>]]>\x00"
as *const u8 as *const libc::c_char; as *const u8 as *const libc::c_char;
let plain: *mut libc::c_char = let plain: *mut libc::c_char =
dc_simplify_simplify(simplify, html, strlen(html) as libc::c_int, 1, 0); simplify.simplify(html, strlen(html) as libc::c_int, 1, 0);
assert_eq!( assert_eq!(
CStr::from_ptr(plain as *const libc::c_char) CStr::from_ptr(plain as *const libc::c_char)
@@ -347,19 +351,18 @@ mod tests {
); );
free(plain as *mut libc::c_void); free(plain as *mut libc::c_void);
dc_simplify_unref(simplify);
} }
} }
#[test] #[test]
fn test_simplify_html_encoded() { fn test_simplify_html_encoded() {
unsafe { unsafe {
let simplify: *mut dc_simplify_t = dc_simplify_new(); let mut simplify = dc_simplify_t::new();
let html: *const libc::c_char = let html: *const libc::c_char =
b"&lt;&gt;&quot;&apos;&amp; &auml;&Auml;&ouml;&Ouml;&uuml;&Uuml;&szlig; foo&AElig;&ccedil;&Ccedil; &diams;&noent;&lrm;&rlm;&zwnj;&zwj;\x00" b"&lt;&gt;&quot;&apos;&amp; &auml;&Auml;&ouml;&Ouml;&uuml;&Uuml;&szlig; foo&AElig;&ccedil;&Ccedil; &diams;&noent;&lrm;&rlm;&zwnj;&zwj;\x00"
as *const u8 as *const libc::c_char; as *const u8 as *const libc::c_char;
let plain: *mut libc::c_char = let plain: *mut libc::c_char =
dc_simplify_simplify(simplify, html, strlen(html) as libc::c_int, 1, 0); simplify.simplify(html, strlen(html) as libc::c_int, 1, 0);
assert_eq!( assert_eq!(
strcmp(plain, strcmp(plain,
@@ -369,7 +372,6 @@ mod tests {
); );
free(plain as *mut libc::c_void); free(plain as *mut libc::c_void);
dc_simplify_unref(simplify);
} }
} }
} }