static int mailmime_type_parse(const char * message, size_t length, size_t * indx, struct mailmime_type ** result) { struct mailmime_discrete_type * discrete_type; struct mailmime_composite_type * composite_type; size_t cur_token; struct mailmime_type * mime_type; int type; int res; int r; cur_token = * indx; discrete_type = NULL; composite_type = NULL; type = MAILMIME_TYPE_ERROR; /* XXX - removes a gcc warning */ r = mailmime_composite_type_parse(message, length, &cur_token, &composite_type); if (r == MAILIMF_NO_ERROR) type = MAILMIME_TYPE_COMPOSITE_TYPE; if (r == MAILIMF_ERROR_PARSE) { r = mailmime_discrete_type_parse(message, length, &cur_token, &discrete_type); if (r == MAILIMF_NO_ERROR) type = MAILMIME_TYPE_DISCRETE_TYPE; } if (r != MAILIMF_NO_ERROR) { res = r; goto err; } mime_type = mailmime_type_new(type, discrete_type, composite_type); if (mime_type == NULL) { res = r; goto free; } * result = mime_type; * indx = cur_token; return MAILIMF_NO_ERROR; free: if (discrete_type != NULL) mailmime_discrete_type_free(discrete_type); if (composite_type != NULL) mailmime_composite_type_free(composite_type); err: return res; }
struct mailmime_content * mailmime_get_content_message(void) { clist * list; struct mailmime_composite_type * composite_type; struct mailmime_type * mime_type; struct mailmime_content * content; char * subtype; composite_type = mailmime_composite_type_new(MAILMIME_COMPOSITE_TYPE_MESSAGE, NULL); if (composite_type == NULL) goto err; mime_type = mailmime_type_new(MAILMIME_TYPE_COMPOSITE_TYPE, NULL, composite_type); if (mime_type == NULL) goto free_composite; composite_type = NULL; list = clist_new(); if (list == NULL) goto free_mime_type; subtype = strdup("rfc822"); if (subtype == NULL) goto free_list; content = mailmime_content_new(mime_type, subtype, list); if (content == NULL) goto free_subtype; return content; free_subtype: free(subtype); free_list: clist_free(list); free_mime_type: mailmime_type_free(mime_type); free_composite: if (composite_type != NULL) mailmime_composite_type_free(composite_type); err: return NULL; }
struct mailmime_content * mailmime_get_content_text(void) { clist * list; struct mailmime_discrete_type * discrete_type; struct mailmime_type * mime_type; struct mailmime_content * content; char * subtype; discrete_type = mailmime_discrete_type_new(MAILMIME_DISCRETE_TYPE_TEXT, NULL); if (discrete_type == NULL) goto err; mime_type = mailmime_type_new(MAILMIME_TYPE_DISCRETE_TYPE, discrete_type, NULL); if (mime_type == NULL) goto free_discrete; discrete_type = NULL; list = clist_new(); if (list == NULL) goto free_type; subtype = strdup("plain"); if (subtype == NULL) goto free_list; content = mailmime_content_new(mime_type, subtype, list); if (content == NULL) goto free_subtype; return content; free_subtype: free(subtype); free_list: clist_free(list); free_type: mailmime_type_free(mime_type); free_discrete: if (discrete_type != NULL) mailmime_discrete_type_free(discrete_type); err: return NULL; }
struct mailmime_type * mailmime_type_dup(struct mailmime_type * type) { struct mailmime_type * dup_type; struct mailmime_discrete_type * discrete_type; struct mailmime_composite_type * composite_type; discrete_type = NULL; composite_type = NULL; switch (type->tp_type) { case MAILMIME_TYPE_DISCRETE_TYPE: discrete_type = mailmime_discrete_type_dup(type->tp_data.tp_discrete_type); if (discrete_type == NULL) goto err; break; composite_type = mailmime_composite_type_dup(type->tp_data.tp_composite_type); if (composite_type == NULL) goto free_discrete; } dup_type = mailmime_type_new(type->tp_type, discrete_type, composite_type); if (dup_type == NULL) goto free_composite; return dup_type; free_composite: if (composite_type != NULL) mailmime_composite_type_free(composite_type); free_discrete: if (discrete_type != NULL) mailmime_discrete_type_free(discrete_type); err: return NULL; }