static void part_extractor_foreach_callback(GMimeObject *parent, GMimeObject *part, gpointer user_data) { PartExtractorData *a_data = (PartExtractorData *) user_data; if (GMIME_IS_MESSAGE_PART(part)) { if (a_data->recursion_depth < RECURSION_LIMIT) { GMimeMessage *message = g_mime_message_part_get_message((GMimeMessagePart *) part); // transfer none if (message) g_mime_message_foreach(message, part_extractor_foreach_callback, a_data); } else { g_printerr("endless recursion detected: %d\r\n", a_data->recursion_depth); return; } } else if (GMIME_IS_MESSAGE_PARTIAL (part)) { // Save into an array ? Todo: Look into the specs } else if (GMIME_IS_MULTIPART (part)) { // Nothing special needed on multipart, let descend further } else if (GMIME_IS_PART (part)) { // We are interested only in the part 0 (counting down by same logic) if (a_data->part_id == 0) extract_part(part, a_data); a_data->part_id--; } else { g_assert_not_reached(); } }
static void test_empty_parts_are_skipped(void) { char part_buf[64]; assert_false(extract_part("::::abc", ':', part_buf) == NULL); assert_string_equal("abc", part_buf); }
static void test_single_char_extracted_correctly(void) { char part_buf[64]; assert_false(extract_part("a:", ':', part_buf) == NULL); assert_string_equal("a", part_buf); }
static void test_no_delimiters_extracted_correctly(void) { char part_buf[64]; assert_false(extract_part("abc", ':', part_buf) == NULL); assert_string_equal("abc", part_buf); }
char * _Locale_extract_numeric_name(char const *full, char *part) { return extract_part(full, part, "LC_NUMERIC", 1); }
char * _Locale_extract_ctype_name(char const *full, char *part) { return extract_part(full, part, "LC_CTYPE", 0); }
char * _Locale_extract_messages_name(char const *full, char *part) { return extract_part(full, part, "LC_MESSAGES", 5); }
char * _Locale_extract_monetary_name(char const *full, char *part) { return extract_part(full, part, "LC_MONETARY", 4); }
char * _Locale_extract_collate_name(char const *full, char *part) { return extract_part(full, part, "LC_COLLATE", 3); }
char * _Locale_extract_time_name(char const *full, char *part) { return extract_part(full, part, "LC_TIME", 2); }
static void test_empty_line_returns_null(void) { char part_buf[64]; assert_string_equal(NULL, extract_part("", ':', part_buf)); }