X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gom%2Fheader.c;h=5dc6b9f99cacadeb392032e6005115738c4b857e;hb=83b1b8c2545fb21b40e2c7cdf7eceb82d3ceda1e;hp=ddc25895d000afff5b224c557a9d4c0450e5cf50;hpb=7ea4ef8cae7b52f2bf66371a5e7b493cbd12900e;p=gedcom-parse.git diff --git a/gom/header.c b/gom/header.c index ddc2589..5dc6b9f 100644 --- a/gom/header.c +++ b/gom/header.c @@ -21,6 +21,7 @@ /* $Id$ */ /* $Name$ */ +#include #include "header.h" #include "submission.h" #include "submitter.h" @@ -38,58 +39,46 @@ Gedcom_ctxt head_start(_REC_PARAMS_) return (Gedcom_ctxt) MAKE_GOM_CTXT(rec, header, &gom_header); } -STRING_CB(header, head_sour_start, source.id) -STRING_CB(header, head_sour_name_start, source.name) -STRING_CB(header, head_sour_vers_start, source.version) -STRING_CB(header, head_sour_corp_start, source.corporation.name) -STRING_CB(header, head_sour_data_start, source.data.name) -DATE_CB(header, head_sour_data_date_start, source.data.date) -STRING_CB(header, head_sour_data_copr_start, source.data.copyright) -STRING_CB(header, head_dest_start, destination) -XREF_CB(header, head_subm_start, submitter, make_submitter_record) -XREF_CB(header, head_subn_start, submission, make_submission_record) -DATE_CB(header, head_date_start, date) -STRING_CB(header, head_date_time_start, time) -STRING_CB(header, head_file_start, filename) -STRING_CB(header, head_copr_start, copyright) -NULL_CB(header, head_gedc_start) -STRING_CB(header, head_gedc_vers_start, gedcom.version) -STRING_CB(header, head_gedc_form_start, gedcom.form) -STRING_CB(header, head_char_start, charset.name) -STRING_CB(header, head_char_vers_start, charset.version) -STRING_CB(header, head_lang_start, language) -NULL_CB(header, head_plac_start) -STRING_CB(header, head_plac_form_start, place_hierarchy) -STRING_CB(header, head_note_start, note) - -void header_add_address(Gom_ctxt ctxt, struct address* addr) -{ - struct header *head = SAFE_CTXT_CAST(header, ctxt); - head->source.corporation.address = addr; -} - -void header_add_phone(Gom_ctxt ctxt, char* phone) -{ - struct header *head = SAFE_CTXT_CAST(header, ctxt); - struct header_corporation *corp = &(head->source.corporation); - if (! corp->phone[0]) - corp->phone[0] = strdup(phone); - else if (! corp->phone[1]) - corp->phone[1] = strdup(phone); - else if (! corp->phone[2]) - corp->phone[2] = strdup(phone); -} +DEFINE_STRING_CB(header, head_sour_start, source.id) +DEFINE_STRING_CB(header, head_sour_name_start, source.name) +DEFINE_STRING_CB(header, head_sour_vers_start, source.version) +DEFINE_STRING_CB(header, head_sour_corp_start, source.corporation.name) +DEFINE_STRING_CB(header, head_sour_data_start, source.data.name) +DEFINE_DATE_CB(header, head_sour_data_date_start, source.data.date) +DEFINE_STRING_CB(header, head_sour_data_copr_start, source.data.copyright) +DEFINE_STRING_CB(header, head_dest_start, destination) +DEFINE_XREF_CB(header, head_subm_start, submitter, submitter) +DEFINE_XREF_CB(header, head_subn_start, submission, submission) +DEFINE_DATE_CB(header, head_date_start, date) +DEFINE_STRING_CB(header, head_date_time_start, time) +DEFINE_STRING_CB(header, head_file_start, filename) +DEFINE_STRING_CB(header, head_copr_start, copyright) +DEFINE_NULL_CB(header, head_gedc_start) +DEFINE_STRING_CB(header, head_gedc_vers_start, gedcom.version) +DEFINE_STRING_CB(header, head_gedc_form_start, gedcom.form) +DEFINE_STRING_CB(header, head_char_start, charset.name) +DEFINE_STRING_CB(header, head_char_vers_start, charset.version) +DEFINE_STRING_CB(header, head_lang_start, language) +DEFINE_NULL_CB(header, head_plac_start) +DEFINE_STRING_CB(header, head_plac_form_start, place_hierarchy) +DEFINE_NULL_CB(header, head_note_start) /* the end cb will fill the value */ +DEFINE_STRING_END_CB(header, head_note_end, note) -void header_add_to_note(NL_TYPE type, Gom_ctxt ctxt, char* str) -{ - struct header *head = SAFE_CTXT_CAST(header, ctxt); - head->note = concat_strings (type, head->note, str); -} - -void header_add_user_data(Gom_ctxt ctxt, struct user_data* data) +DEFINE_ADDFUNC2_NOLIST(header, address, source.corporation.address) +DEFINE_ADDFUNC2(header, user_data, extra) + +void header_add_phone(Gom_ctxt ctxt, const char* phone) { struct header *head = SAFE_CTXT_CAST(header, ctxt); - LINK_CHAIN_ELT(user_data, head->extra, data) + if (head) { + struct header_corporation *corp = &(head->source.corporation); + int i = 0; + while (i<2 && corp->phone[i]) i++; + if (! corp->phone[i]) { + corp->phone[i] = strdup(phone); + if (! corp->phone[i]) MEMORY_ERROR; + } + } } void header_subscribe() @@ -128,7 +117,7 @@ void header_subscribe() gedcom_subscribe_to_element(ELT_HEAD_PLAC, head_plac_start, def_elt_end); gedcom_subscribe_to_element(ELT_HEAD_PLAC_FORM, head_plac_form_start, def_elt_end); - gedcom_subscribe_to_element(ELT_HEAD_NOTE, head_note_start, def_elt_end); + gedcom_subscribe_to_element(ELT_HEAD_NOTE, head_note_start, head_note_end); } void header_cleanup() @@ -137,7 +126,7 @@ void header_cleanup() SAFE_FREE(gom_header.source.name); SAFE_FREE(gom_header.source.version); SAFE_FREE(gom_header.source.corporation.name); - address_cleanup(gom_header.source.corporation.address); + CLEANFUNC(address)(gom_header.source.corporation.address); SAFE_FREE(gom_header.source.corporation.phone[0]); SAFE_FREE(gom_header.source.corporation.phone[1]); SAFE_FREE(gom_header.source.corporation.phone[2]); @@ -156,10 +145,116 @@ void header_cleanup() SAFE_FREE(gom_header.language); SAFE_FREE(gom_header.place_hierarchy); SAFE_FREE(gom_header.note); - DESTROY_CHAIN_ELTS(user_data, gom_header.extra, user_data_cleanup) + DESTROY_CHAIN_ELTS(user_data, gom_header.extra); } struct header* gom_get_header() { return &gom_header; } + +int gom_header_update_timestamp(time_t t) +{ + int result = 0; + struct tm *tm_ptr = localtime(&t); + result |= update_date(&gom_header.date, tm_ptr); + result |= update_time(&gom_header.time, tm_ptr); + return result; +} + +int write_header(Gedcom_write_hndl hndl) +{ + int result = 0; + int i; + + result |= gedcom_write_record_str(hndl, REC_HEAD, NULL, NULL); + if (gom_header.charset.name) + result |= gedcom_write_element_str(hndl, ELT_HEAD_CHAR, 0, REC_HEAD, + gom_header.charset.name); + if (gom_header.charset.version) + result |= gedcom_write_element_str(hndl, ELT_HEAD_CHAR_VERS, 0, + ELT_HEAD_CHAR, + gom_header.charset.version); + if (gom_header.source.id) + result |= gedcom_write_element_str(hndl, ELT_HEAD_SOUR, 0, REC_HEAD, + gom_header.source.id); + if (gom_header.source.name) + result |= gedcom_write_element_str(hndl, ELT_HEAD_SOUR_NAME, 0, + ELT_HEAD_SOUR, + gom_header.source.name); + if (gom_header.source.version) + result |= gedcom_write_element_str(hndl, ELT_HEAD_SOUR_VERS, 0, + ELT_HEAD_SOUR, + gom_header.source.version); + if (gom_header.source.corporation.name) + result |= gedcom_write_element_str(hndl, ELT_HEAD_SOUR_CORP, 0, + ELT_HEAD_SOUR, + gom_header.source.corporation.name); + if (gom_header.source.corporation.address) + result |= write_address(hndl, ELT_HEAD_SOUR_CORP, + gom_header.source.corporation.address); + for (i = 0; i < 3 && gom_header.source.corporation.phone[i]; i++) + result |= gedcom_write_element_str(hndl, ELT_SUB_PHON, 0, ELT_HEAD_SOUR_CORP, + gom_header.source.corporation.phone[i]); + if (gom_header.source.data.name) + result |= gedcom_write_element_str(hndl, ELT_HEAD_SOUR_DATA, 0, + ELT_HEAD_SOUR, + gom_header.source.data.name); + if (gom_header.source.data.date) + result |= gedcom_write_element_date(hndl, ELT_HEAD_SOUR_DATA_DATE, 0, + ELT_HEAD_SOUR_DATA, + gom_header.source.data.date); + if (gom_header.source.data.copyright) + result |= gedcom_write_element_str(hndl, ELT_HEAD_SOUR_DATA_COPR, 0, + ELT_HEAD_SOUR_DATA, + gom_header.source.data.copyright); + if (gom_header.destination) + result |= gedcom_write_element_str(hndl, ELT_HEAD_DEST, 0, REC_HEAD, + gom_header.destination); + if (gom_header.date) + result |= gedcom_write_element_date(hndl, ELT_HEAD_DATE, 0, REC_HEAD, + gom_header.date); + if (gom_header.time) + result |= gedcom_write_element_str(hndl, ELT_HEAD_DATE_TIME, 0, + ELT_HEAD_DATE, gom_header.time); + if (gom_header.submitter) + result |= gedcom_write_element_xref(hndl, ELT_HEAD_SUBM, 0, REC_HEAD, + gom_header.submitter); + if (gom_header.submission) + result |= gedcom_write_element_xref(hndl, ELT_HEAD_SUBN, 0, REC_HEAD, + gom_header.submission); + if (gom_header.filename) + result |= gedcom_write_element_str(hndl, ELT_HEAD_FILE, 0, REC_HEAD, + gom_header.filename); + if (gom_header.copyright) + result |= gedcom_write_element_str(hndl, ELT_HEAD_COPR, 0, REC_HEAD, + gom_header.copyright); + result |= gedcom_write_element_str(hndl, ELT_HEAD_GEDC, 0, REC_HEAD, + NULL); + if (gom_header.gedcom.version) + result |= gedcom_write_element_str(hndl, ELT_HEAD_GEDC_VERS, 0, + ELT_HEAD_GEDC, + gom_header.gedcom.version); + if (gom_header.gedcom.form) + result |= gedcom_write_element_str(hndl, ELT_HEAD_GEDC_FORM, 0, + ELT_HEAD_GEDC, + gom_header.gedcom.form); + if (gom_header.language) + result |= gedcom_write_element_str(hndl, ELT_HEAD_LANG, 0, + REC_HEAD, + gom_header.language); + if (gom_header.place_hierarchy) { + result |= gedcom_write_element_str(hndl, ELT_HEAD_PLAC, 0, REC_HEAD, + NULL); + result |= gedcom_write_element_str(hndl, ELT_HEAD_PLAC_FORM, 0, + ELT_HEAD_PLAC, + gom_header.place_hierarchy); + } + if (gom_header.note) + result |= gedcom_write_element_str(hndl, ELT_HEAD_NOTE, 0, + REC_HEAD, + gom_header.note); + if (gom_header.extra) + result |= write_user_data(hndl, gom_header.extra); + return result; +}