static int mailmime_size_parm_parse(const char * message, size_t length, size_t * indx, size_t * result) { uint32_t value; size_t cur_token; int r; cur_token = * indx; r = mailimf_token_case_insensitive_parse(message, length, &cur_token, "size"); if (r != MAILIMF_NO_ERROR) return r; r = mailimf_unstrict_char_parse(message, length, &cur_token, '='); if (r != MAILIMF_NO_ERROR) return r; r = mailimf_cfws_parse(message, length, &cur_token); if ((r != MAILIMF_NO_ERROR) && (r != MAILIMF_ERROR_PARSE)) return r; r = mailimf_number_parse(message, length, &cur_token, &value); if (r != MAILIMF_NO_ERROR) return r; * indx = cur_token; * result = value; return MAILIMF_NO_ERROR; }
static int mailmime_modification_date_parm_parse(const char * message, size_t length, size_t * indx, char ** result) { char * value; size_t cur_token; int r; cur_token = * indx; r = mailimf_token_case_insensitive_parse(message, length, &cur_token, "modification-date"); if (r != MAILIMF_NO_ERROR) return r; r = mailimf_unstrict_char_parse(message, length, &cur_token, '='); if (r != MAILIMF_NO_ERROR) return r; r = mailimf_cfws_parse(message, length, &cur_token); if ((r != MAILIMF_NO_ERROR) && (r != MAILIMF_ERROR_PARSE)) return r; r = mailmime_quoted_date_time_parse(message, length, &cur_token, &value); if (r != MAILIMF_NO_ERROR) return r; * indx = cur_token; * result = value; return MAILIMF_NO_ERROR; }
LIBETPAN_EXPORT int mailmime_parameter_parse(const char * message, size_t length, size_t * indx, struct mailmime_parameter ** result) { char * attribute; char * value; struct mailmime_parameter * parameter; size_t cur_token; int r; int res; cur_token = * indx; r = mailmime_attribute_parse(message, length, &cur_token, &attribute); if (r != MAILIMF_NO_ERROR) { res = r; goto err; } r = mailimf_unstrict_char_parse(message, length, &cur_token, '='); if (r != MAILIMF_NO_ERROR) { res = r; goto free_attr; } r = mailimf_cfws_parse(message, length, &cur_token); if ((r != MAILIMF_NO_ERROR) && (r != MAILIMF_ERROR_PARSE)) { res = r; goto free_attr; } r = mailmime_value_parse(message, length, &cur_token, &value); if (r != MAILIMF_NO_ERROR) { res = r; goto free_attr; } parameter = mailmime_parameter_new(attribute, value); if (parameter == NULL) { res = MAILIMF_ERROR_MEMORY; goto free_value; } * result = parameter; * indx = cur_token; return MAILIMF_NO_ERROR; free_value: mailmime_value_free(value); free_attr: mailmime_attribute_free(attribute); err: return res; }
LIBETPAN_EXPORT int mailmime_version_parse(const char * message, size_t length, size_t * indx, uint32_t * result) { size_t cur_token; uint32_t hi; uint32_t low; uint32_t version; int r; cur_token = * indx; r = mailimf_number_parse(message, length, &cur_token, &hi); if (r != MAILIMF_NO_ERROR) return r; r = mailimf_unstrict_char_parse(message, length, &cur_token, '.'); if (r != MAILIMF_NO_ERROR) return r; r = mailimf_cfws_parse(message, length, &cur_token); if ((r != MAILIMF_NO_ERROR) && (r != MAILIMF_ERROR_PARSE)) return r; r = mailimf_number_parse(message, length, &cur_token, &low); if (r != MAILIMF_NO_ERROR) return r; version = (hi << 16) + low; * result = version; * indx = cur_token; return MAILIMF_NO_ERROR; }
LIBETPAN_EXPORT int mailmime_content_parse(const char * message, size_t length, size_t * indx, struct mailmime_content ** result) { size_t cur_token; struct mailmime_type * type; char * subtype; clist * parameters_list; struct mailmime_content * content; int r; int res; cur_token = * indx; mailimf_cfws_parse(message, length, &cur_token); type = NULL; r = mailmime_type_parse(message, length, &cur_token, &type); if (r != MAILIMF_NO_ERROR) { res = r; goto err; } r = mailimf_unstrict_char_parse(message, length, &cur_token, '/'); switch (r) { case MAILIMF_NO_ERROR: r = mailimf_cfws_parse(message, length, &cur_token); if ((r != MAILIMF_NO_ERROR) && (r != MAILIMF_ERROR_PARSE)) { res = r; goto free_type; } r = mailmime_subtype_parse(message, length, &cur_token, &subtype); if (r != MAILIMF_NO_ERROR) { res = r; goto free_type; } break; case MAILIMF_ERROR_PARSE: subtype = strdup("unknown"); break; default: res = r; goto free_type; } parameters_list = clist_new(); if (parameters_list == NULL) { res = MAILIMF_ERROR_MEMORY; goto free_subtype; } while (1) { size_t final_token; struct mailmime_parameter * parameter; final_token = cur_token; r = mailimf_unstrict_char_parse(message, length, &cur_token, ';'); if (r != MAILIMF_NO_ERROR) { cur_token = final_token; break; } r = mailimf_cfws_parse(message, length, &cur_token); if ((r != MAILIMF_NO_ERROR) && (r != MAILIMF_ERROR_PARSE)) { res = r; goto free_type; } r = mailmime_parameter_parse(message, length, &cur_token, ¶meter); if (r == MAILIMF_NO_ERROR) { /* do nothing */ } else if (r == MAILIMF_ERROR_PARSE) { cur_token = final_token; break; } else { res = r; goto err; } r = clist_append(parameters_list, parameter); if (r < 0) { mailmime_parameter_free(parameter); res = MAILIMF_ERROR_MEMORY; goto free_parameters; } } content = mailmime_content_new(type, subtype, parameters_list); if (content == NULL) { res = MAILIMF_ERROR_MEMORY; goto free_parameters; } * result = content; * indx = cur_token; return MAILIMF_NO_ERROR; free_parameters: clist_foreach(parameters_list, (clist_func) mailmime_parameter_free, NULL); clist_free(parameters_list); free_subtype: mailmime_subtype_free(subtype); free_type: mailmime_type_free(type); err: return res; }
LIBETPAN_EXPORT int mailmime_language_parse(const char * message, size_t length, size_t * indx, struct mailmime_language ** result) { size_t cur_token; int r; int res; clist * list; int first; struct mailmime_language * language; cur_token = * indx; list = clist_new(); if (list == NULL) { res = MAILIMF_ERROR_MEMORY; goto err; } first = TRUE; while (1) { char * atom; r = mailimf_unstrict_char_parse(message, length, &cur_token, ','); if (r == MAILIMF_NO_ERROR) { /* do nothing */ } else if (r == MAILIMF_ERROR_PARSE) { break; } else { res = r; goto err; } r = mailimf_atom_parse(message, length, &cur_token, &atom); if (r == MAILIMF_NO_ERROR) { /* do nothing */ } else if (r == MAILIMF_ERROR_PARSE) { break; } else { res = r; goto err; } r = clist_append(list, atom); if (r < 0) { mailimf_atom_free(atom); res = MAILIMF_ERROR_MEMORY; goto free; } } language = mailmime_language_new(list); if (language == NULL) { res = MAILIMF_ERROR_MEMORY; goto free; } * result = language; * indx = cur_token; return MAILIMF_NO_ERROR; free: clist_foreach(list, (clist_func) mailimf_atom_free, NULL); clist_free(list); err: return res; }
int mailmime_disposition_parse(const char * message, size_t length, size_t * indx, struct mailmime_disposition ** result) { size_t final_token; size_t cur_token; struct mailmime_disposition_type * dsp_type; clist * list; struct mailmime_disposition * dsp; int r; int res; cur_token = * indx; r = mailmime_disposition_type_parse(message, length, &cur_token, &dsp_type); if (r != MAILIMF_NO_ERROR) { res = r; goto err; } list = clist_new(); if (list == NULL) { res = MAILIMF_ERROR_MEMORY; goto free_type; } while (1) { struct mailmime_disposition_parm * param; final_token = cur_token; r = mailimf_unstrict_char_parse(message, length, &cur_token, ';'); if (r == MAILIMF_NO_ERROR) { /* do nothing */ } else if (r == MAILIMF_ERROR_PARSE) { break; } else { res = r; goto free_list; } param = NULL; r = mailmime_disposition_parm_parse(message, length, &cur_token, ¶m); if (r == MAILIMF_NO_ERROR) { /* do nothing */ } else if (r == MAILIMF_ERROR_PARSE) { cur_token = final_token; break; } else { res = r; goto free_list; } r = clist_append(list, param); if (r < 0) { res = MAILIMF_ERROR_MEMORY; goto free_list; } } dsp = mailmime_disposition_new(dsp_type, list); if (dsp == NULL) { res = MAILIMF_ERROR_MEMORY; goto free_list; } * result = dsp; * indx = cur_token; return MAILIMF_NO_ERROR; free_list: clist_foreach(list, (clist_func) mailmime_disposition_parm_free, NULL); clist_free(list); free_type: mailmime_disposition_type_free(dsp_type); err: return res; }