Gedcom_ctxt subm_lang_start(_ELT_PARAMS_)
{
Gom_ctxt ctxt = (Gom_ctxt)parent;
- struct submitter *subm = SAFE_CTXT_CAST(submitter, ctxt);
- char *str = GEDCOM_STRING(parsed_value);
-
- if (! subm->language[0])
- subm->language[0] = strdup(str);
- else if (! subm->language[1])
- subm->language[1] = strdup(str);
- else if (! subm->language[2])
- subm->language[2] = strdup(str);
+ Gom_ctxt result = NULL;
+
+ if (! ctxt)
+ NO_CONTEXT;
+ else {
+ struct submitter *subm = SAFE_CTXT_CAST(submitter, ctxt);
+
+ if (subm) {
+ int err = 0;
+ char *str = GEDCOM_STRING(parsed_value);
+ int i = 0;
+
+ while (i<2 && subm->language[i]) i++;
+ if (! subm->language[i]) {
+ subm->language[i] = strdup(str);
+ if (! subm->language[i]) {
+ MEMORY_ERROR;
+ err = 1;
+ }
+ }
+ if (! err)
+ result = MAKE_GOM_CTXT(elt, submitter, subm);
+ }
+ }
- return (Gedcom_ctxt) MAKE_GOM_CTXT(elt, submitter, subm);
+ return (Gedcom_ctxt)result;
}
void submitter_subscribe()
void submitter_add_address(Gom_ctxt ctxt, struct address* address)
{
struct submitter *subm = SAFE_CTXT_CAST(submitter, ctxt);
- subm->address = address;
+ if (subm)
+ subm->address = address;
}
void submitter_add_phone(Gom_ctxt ctxt, char *phone)
{
struct submitter *subm = SAFE_CTXT_CAST(submitter, ctxt);
- if (! subm->phone[0])
- subm->phone[0] = strdup(phone);
- else if (! subm->phone[1])
- subm->phone[1] = strdup(phone);
- else if (! subm->phone[2])
- subm->phone[2] = strdup(phone);
+ if (subm) {
+ int i = 0;
+ while (i<2 && subm->phone[i]) i++;
+ if (! subm->phone[i]) {
+ subm->phone[i] = strdup(phone);
+ if (! subm->phone[i]) MEMORY_ERROR;
+ }
+ }
}
void submitter_add_mm_link(Gom_ctxt ctxt, struct multimedia_link* link)
{
struct submitter *subm = SAFE_CTXT_CAST(submitter, ctxt);
- LINK_CHAIN_ELT(multimedia_link, subm->mm_link, link)
+ if (subm)
+ LINK_CHAIN_ELT(multimedia_link, subm->mm_link, link);
}
void submitter_set_change_date(Gom_ctxt ctxt, struct change_date* chan)
{
struct submitter *subm = SAFE_CTXT_CAST(submitter, ctxt);
- subm->change_date = chan;
+ if (subm)
+ subm->change_date = chan;
}
void submitter_add_user_data(Gom_ctxt ctxt, struct user_data* data)
{
struct submitter *obj = SAFE_CTXT_CAST(submitter, ctxt);
- LINK_CHAIN_ELT(user_data, obj->extra, data)
+ if (obj)
+ LINK_CHAIN_ELT(user_data, obj->extra, data);
}
void submitter_cleanup(struct submitter* rec)
{
- SAFE_FREE(rec->xrefstr);
- SAFE_FREE(rec->name);
- address_cleanup(rec->address);
- SAFE_FREE(rec->phone[0]);
- SAFE_FREE(rec->phone[1]);
- SAFE_FREE(rec->phone[2]);
- DESTROY_CHAIN_ELTS(multimedia_link, rec->mm_link, multimedia_link_cleanup)
- SAFE_FREE(rec->language[0]);
- SAFE_FREE(rec->language[1]);
- SAFE_FREE(rec->language[2]);
- SAFE_FREE(rec->record_file_nr);
- SAFE_FREE(rec->record_id);
- change_date_cleanup(rec->change_date);
- DESTROY_CHAIN_ELTS(user_data, rec->extra, user_data_cleanup)
+ if (rec) {
+ SAFE_FREE(rec->xrefstr);
+ SAFE_FREE(rec->name);
+ address_cleanup(rec->address);
+ SAFE_FREE(rec->phone[0]);
+ SAFE_FREE(rec->phone[1]);
+ SAFE_FREE(rec->phone[2]);
+ DESTROY_CHAIN_ELTS(multimedia_link, rec->mm_link, multimedia_link_cleanup);
+ SAFE_FREE(rec->language[0]);
+ SAFE_FREE(rec->language[1]);
+ SAFE_FREE(rec->language[2]);
+ SAFE_FREE(rec->record_file_nr);
+ SAFE_FREE(rec->record_id);
+ change_date_cleanup(rec->change_date);
+ DESTROY_CHAIN_ELTS(user_data, rec->extra, user_data_cleanup);
+ }
}
void submitters_cleanup()
struct submitter* make_submitter_record(char* xrefstr)
{
- struct submitter* subm;
+ struct submitter* subm = NULL;
MAKE_CHAIN_ELT(submitter, gom_first_submitter, subm);
- subm->xrefstr = strdup(xrefstr);
+ if (subm) {
+ subm->xrefstr = strdup(xrefstr);
+ if (!subm->xrefstr) MEMORY_ERROR;
+ }
return subm;
}