- struct user_data *data = (struct user_data *)malloc(sizeof(struct user_data));
- memset (data, 0, sizeof(struct user_data));
-
- data->level = level;
- data->tag = strdup(tag);
- if (GEDCOM_IS_STRING(parsed_value))
- data->str_value = strdup(GEDCOM_STRING(parsed_value));
- else if (GEDCOM_IS_XREF_PTR(parsed_value))
- data->xref_value = GEDCOM_XREF_PTR(parsed_value);
-
- if (ctxt) {
- switch (ctxt->obj_type) {
- case T_header:
- header_add_user_data(ctxt, data); break;
- case T_submission:
- submission_add_user_data(ctxt, data); break;
- case T_submitter:
- submitter_add_user_data(ctxt, data); break;
- case T_family:
- family_add_user_data(ctxt, data); break;
- case T_individual:
- individual_add_user_data(ctxt, data); break;
- case T_multimedia:
- multimedia_add_user_data(ctxt, data); break;
- case T_note:
- note_add_user_data(ctxt, data); break;
- case T_repository:
- repository_add_user_data(ctxt, data); break;
- case T_source:
- source_add_user_data(ctxt, data); break;
- case T_user_rec:
- user_rec_add_user_data(ctxt, data); break;
- case T_address:
- address_add_user_data(ctxt, data); break;
- case T_event:
- event_add_user_data(ctxt, data); break;
- case T_place:
- place_add_user_data(ctxt, data); break;
- case T_source_citation:
- citation_add_user_data(ctxt, data); break;
- case T_note_sub:
- note_sub_add_user_data(ctxt, data); break;
- case T_multimedia_link:
- multimedia_link_add_user_data(ctxt, data); break;
- case T_lds_event:
- lds_event_add_user_data(ctxt, data); break;
- case T_user_ref_number:
- user_ref_add_user_data(ctxt, data); break;
- case T_change_date:
- change_date_add_user_data(ctxt, data); break;
- case T_personal_name:
- name_add_user_data(ctxt, data); break;
- case T_family_link:
- family_link_add_user_data(ctxt, data); break;
- case T_association:
- association_add_user_data(ctxt, data); break;
- case T_source_event:
- source_event_add_user_data(ctxt, data); break;
- case T_source_description:
- source_description_add_user_data(ctxt, data); break;
- default:
- UNEXPECTED_CONTEXT(ctxt->ctxt_type);
+ Gom_ctxt result = NULL;
+ int err = 0;
+
+ if (! ctxt)
+ NO_CONTEXT;
+ else {
+ struct user_data *data
+ = (struct user_data *)malloc(sizeof(struct user_data));
+
+ if (! data)
+ MEMORY_ERROR;
+ else {
+ memset (data, 0, sizeof(struct user_data));
+
+ data->level = level;
+ data->tag = strdup(tag);
+ if (! data->tag) {
+ MEMORY_ERROR;
+ free(data);
+ err = 1;
+ }
+ else if (GEDCOM_IS_STRING(parsed_value)) {
+ data->str_value = strdup(GEDCOM_STRING(parsed_value));
+ if (! data->str_value) {
+ MEMORY_ERROR;
+ free(data->tag);
+ free(data->str_value);
+ err = 1;
+ }
+ }
+ else if (GEDCOM_IS_XREF_PTR(parsed_value))
+ data->xref_value = GEDCOM_XREF_PTR(parsed_value);
+
+ if (! err) {
+ switch (ctxt->obj_type) {
+ case T_header:
+ header_add_user_data(ctxt, data); break;
+ case T_submission:
+ submission_add_user_data(ctxt, data); break;
+ case T_submitter:
+ submitter_add_user_data(ctxt, data); break;
+ case T_family:
+ family_add_user_data(ctxt, data); break;
+ case T_individual:
+ individual_add_user_data(ctxt, data); break;
+ case T_multimedia:
+ multimedia_add_user_data(ctxt, data); break;
+ case T_note:
+ note_add_user_data(ctxt, data); break;
+ case T_repository:
+ repository_add_user_data(ctxt, data); break;
+ case T_source:
+ source_add_user_data(ctxt, data); break;
+ case T_user_rec:
+ user_rec_add_user_data(ctxt, data); break;
+ case T_address:
+ address_add_user_data(ctxt, data); break;
+ case T_event:
+ event_add_user_data(ctxt, data); break;
+ case T_place:
+ place_add_user_data(ctxt, data); break;
+ case T_source_citation:
+ citation_add_user_data(ctxt, data); break;
+ case T_note_sub:
+ note_sub_add_user_data(ctxt, data); break;
+ case T_multimedia_link:
+ multimedia_link_add_user_data(ctxt, data); break;
+ case T_lds_event:
+ lds_event_add_user_data(ctxt, data); break;
+ case T_user_ref_number:
+ user_ref_add_user_data(ctxt, data); break;
+ case T_change_date:
+ change_date_add_user_data(ctxt, data); break;
+ case T_personal_name:
+ name_add_user_data(ctxt, data); break;
+ case T_family_link:
+ family_link_add_user_data(ctxt, data); break;
+ case T_association:
+ association_add_user_data(ctxt, data); break;
+ case T_source_event:
+ source_event_add_user_data(ctxt, data); break;
+ case T_source_description:
+ source_description_add_user_data(ctxt, data); break;
+ default:
+ UNEXPECTED_CONTEXT(ctxt->ctxt_type);
+ }
+ result = make_gom_ctxt(elt, ctxt->obj_type, ctxt->ctxt_ptr);
+ }