X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gom%2Fchange_date.c;h=1038df32ba577d1f8c0012dace9e6ca0980ab641;hb=d70e2fdb664f6723cd8a1c131fdbeb39cb75d7be;hp=9bcb6164732febc98cd783fc6c6f80222dbcb005;hpb=7ea4ef8cae7b52f2bf66371a5e7b493cbd12900e;p=gedcom-parse.git diff --git a/gom/change_date.c b/gom/change_date.c index 9bcb616..1038df3 100644 --- a/gom/change_date.c +++ b/gom/change_date.c @@ -23,6 +23,7 @@ #include #include +#include #include "change_date.h" #include "family.h" #include "individual.h" @@ -40,36 +41,48 @@ Gedcom_ctxt sub_chan_start(_ELT_PARAMS_) { Gom_ctxt ctxt = (Gom_ctxt)parent; - struct change_date *chan - = (struct change_date *)malloc(sizeof(struct change_date)); - memset (chan, 0, sizeof(struct change_date)); - - if (ctxt) { - switch (ctxt->ctxt_type) { - case REC_FAM: - family_set_change_date(ctxt, chan); break; - case REC_INDI: - individual_set_change_date(ctxt, chan); break; - case REC_OBJE: - multimedia_set_change_date(ctxt, chan); break; - case REC_NOTE: - note_set_change_date(ctxt, chan); break; - case REC_REPO: - repository_set_change_date(ctxt, chan); break; - case REC_SOUR: - source_set_change_date(ctxt, chan); break; - case REC_SUBM: - submitter_set_change_date(ctxt, chan); break; - default: - UNEXPECTED_CONTEXT(ctxt->ctxt_type); + Gom_ctxt result = NULL; + + if (! ctxt) + NO_CONTEXT; + else { + struct change_date *chan + = (struct change_date *)malloc(sizeof(struct change_date)); + if (! chan) + MEMORY_ERROR; + else { + memset (chan, 0, sizeof(struct change_date)); + + switch (ctxt->ctxt_type) { + case REC_FAM: + ADDFUNC2_NOLIST(family,change_date)(ctxt, chan); break; + case REC_INDI: + ADDFUNC2_NOLIST(individual,change_date)(ctxt, chan); break; + case REC_OBJE: + ADDFUNC2_NOLIST(multimedia,change_date)(ctxt, chan); break; + case REC_NOTE: + ADDFUNC2_NOLIST(note,change_date)(ctxt, chan); break; + case REC_REPO: + ADDFUNC2_NOLIST(repository,change_date)(ctxt, chan); break; + case REC_SOUR: + ADDFUNC2_NOLIST(source,change_date)(ctxt, chan); break; + case REC_SUBM: + ADDFUNC2_NOLIST(submitter,change_date)(ctxt, chan); break; + default: + UNEXPECTED_CONTEXT(ctxt->ctxt_type); + } + result = MAKE_GOM_CTXT(elt, change_date, chan); } } - return (Gedcom_ctxt) MAKE_GOM_CTXT(elt, change_date, chan); + return (Gedcom_ctxt)result; } -DATE_CB(change_date, sub_chan_date_start, date) -STRING_CB(change_date, sub_chan_time_start, time) +DEFINE_DATE_CB(change_date, sub_chan_date_start, date) +DEFINE_STRING_CB(change_date, sub_chan_time_start, time) + +DEFINE_ADDFUNC2(change_date, note_sub, note) +DEFINE_ADDFUNC2(change_date, user_data, extra) void change_date_subscribe() { @@ -80,25 +93,107 @@ void change_date_subscribe() def_elt_end); } -void change_date_add_note(Gom_ctxt ctxt, struct note_sub* note) +void CLEANFUNC(change_date)(struct change_date *chan) +{ + if (chan) { + SAFE_FREE(chan->date); + SAFE_FREE(chan->time); + DESTROY_CHAIN_ELTS(note_sub, chan->note); + DESTROY_CHAIN_ELTS(user_data, chan->extra); + } + SAFE_FREE(chan); +} + +struct change_date* gom_add_change_date(struct change_date** chan) +{ + struct change_date *obj = NULL; + if (chan && ! *chan) { + obj = (struct change_date*) malloc(sizeof(struct change_date)); + if (! obj) + MEMORY_ERROR; + else { + memset(obj, 0, sizeof(struct change_date)); + *chan = obj; + } + } + return obj; +} + +int gom_delete_change_date(struct change_date** chan) +{ + int result = 1; + if (chan && *chan) { + CLEANFUNC(change_date)(*chan); + free(*chan); + *chan = NULL; + result = 0; + } + return result; +} + +int update_date(struct date_value** dv, struct tm* tm_ptr) { - struct change_date *chan = SAFE_CTXT_CAST(change_date, ctxt); - LINK_CHAIN_ELT(note_sub, chan->note, note) + int result; + struct date_value* dval = gedcom_new_date_value(NULL); + dval->type = DV_NO_MODIFIER; + dval->date1.cal = CAL_GREGORIAN; + dval->date1.day = tm_ptr->tm_mday; + dval->date1.month = tm_ptr->tm_mon + 1; + dval->date1.year = tm_ptr->tm_year + 1900; + result = gedcom_normalize_date(DI_FROM_NUMBERS, dval); + + if (result == 0) { + if (*dv) free(*dv); + *dv = dval; + } + return result; } -void change_date_add_user_data(Gom_ctxt ctxt, struct user_data* data) +int update_time(char** tv, struct tm* tm_ptr) { - struct change_date *obj = SAFE_CTXT_CAST(change_date, ctxt); - LINK_CHAIN_ELT(user_data, obj->extra, data) + char tval[16]; + sprintf(tval, "%02d:%02d:%02d", + tm_ptr->tm_hour, tm_ptr->tm_min, tm_ptr->tm_sec); + + if (gom_set_string(tv, tval)) + return 0; + else + return 1; } -void change_date_cleanup(struct change_date *chan) +int gom_update_timestamp(struct change_date** chan, time_t t) { + int result = 1; if (chan) { - SAFE_FREE(chan->date); - SAFE_FREE(chan->time); - DESTROY_CHAIN_ELTS(note_sub, chan->note, note_sub_cleanup) - DESTROY_CHAIN_ELTS(user_data, chan->extra, user_data_cleanup) + if (! *chan) gom_add_change_date(chan); + if (*chan) { + struct tm *tm_ptr = localtime(&t); + result = 0; + result |= update_date(&((*chan)->date), tm_ptr); + result |= update_time(&((*chan)->time), tm_ptr); + } } - SAFE_FREE(chan); + return result; +} + +int write_change_date(Gedcom_write_hndl hndl, int parent, + struct change_date *chan) +{ + int result = 0; + + if (!chan) return 1; + + result |= gedcom_write_element_str(hndl, ELT_SUB_CHAN, 0, parent, NULL); + if (chan->date) + result |= gedcom_write_element_date(hndl, ELT_SUB_CHAN_DATE, 0, + ELT_SUB_CHAN, chan->date); + if (chan->time) + result |= gedcom_write_element_str(hndl, ELT_SUB_CHAN_TIME, 0, + ELT_SUB_CHAN_DATE, chan->time); + if (chan->note) + result |= write_note_subs(hndl, ELT_SUB_CHAN, chan->note); + if (chan->extra) + result |= write_user_data(hndl, chan->extra); + + return result; }