- 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:
+ ADDFUNC2(header,user_data)(ctxt, data); break;
+ case T_submission:
+ ADDFUNC2(submission,user_data)(ctxt, data); break;
+ case T_submitter:
+ ADDFUNC2(submitter,user_data)(ctxt, data); break;
+ case T_family:
+ ADDFUNC2(family,user_data)(ctxt, data); break;
+ case T_individual:
+ ADDFUNC2(individual,user_data)(ctxt, data); break;
+ case T_multimedia:
+ ADDFUNC2(multimedia,user_data)(ctxt, data); break;
+ case T_note:
+ ADDFUNC2(note,user_data)(ctxt, data); break;
+ case T_repository:
+ ADDFUNC2(repository,user_data)(ctxt, data); break;
+ case T_source:
+ ADDFUNC2(source,user_data)(ctxt, data); break;
+ case T_user_rec:
+ ADDFUNC2(user_rec,user_data)(ctxt, data); break;
+ case T_address:
+ ADDFUNC2(address,user_data)(ctxt, data); break;
+ case T_event:
+ ADDFUNC2(event,user_data)(ctxt, data); break;
+ case T_place:
+ ADDFUNC2(place,user_data)(ctxt, data); break;
+ case T_source_citation:
+ ADDFUNC2(source_citation,user_data)(ctxt, data); break;
+ case T_note_sub:
+ ADDFUNC2(note_sub,user_data)(ctxt, data); break;
+ case T_multimedia_link:
+ ADDFUNC2(multimedia_link,user_data)(ctxt, data); break;
+ case T_lds_event:
+ ADDFUNC2(lds_event,user_data)(ctxt, data); break;
+ case T_user_ref_number:
+ ADDFUNC2(user_ref_number,user_data)(ctxt, data); break;
+ case T_change_date:
+ ADDFUNC2(change_date,user_data)(ctxt, data); break;
+ case T_personal_name:
+ ADDFUNC2(personal_name,user_data)(ctxt, data); break;
+ case T_family_link:
+ ADDFUNC2(family_link,user_data)(ctxt, data); break;
+ case T_association:
+ ADDFUNC2(association,user_data)(ctxt, data); break;
+ case T_source_event:
+ ADDFUNC2(source_event,user_data)(ctxt, data); break;
+ case T_source_description:
+ ADDFUNC2(source_description,user_data)(ctxt, data); break;
+ default:
+ UNEXPECTED_CONTEXT(ctxt->ctxt_type);
+ }
+ result = make_gom_ctxt(elt, ctxt->obj_type, ctxt->ctxt_ptr);
+ }