X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gom%2Fchange_date.c;h=417dbf0523400e13e2f535832f7ee7150be3d0eb;hb=1b7536d78e236978e83fbf8acc9f90e2141e13b0;hp=0e568691afe2401b5e45630a3c4533a5b7a53e49;hpb=72689522e287ca3b2231e7d8881f0fe5bea48f15;p=gedcom-parse.git diff --git a/gom/change_date.c b/gom/change_date.c index 0e56869..417dbf0 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" @@ -45,13 +46,8 @@ Gedcom_ctxt sub_chan_start(_ELT_PARAMS_) 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)); - + struct change_date *chan = SUB_MAKEFUNC(change_date)(); + if (chan) { switch (ctxt->ctxt_type) { case REC_FAM: ADDFUNC2_NOLIST(family,change_date)(ctxt, chan); break; @@ -77,6 +73,10 @@ Gedcom_ctxt sub_chan_start(_ELT_PARAMS_) return (Gedcom_ctxt)result; } +DEFINE_SUB_MAKEFUNC(change_date) +DEFINE_SUB_SETFUNC(change_date) +DEFINE_SUB_DELETEFUNC(change_date) + DEFINE_DATE_CB(change_date, sub_chan_date_start, date) DEFINE_STRING_CB(change_date, sub_chan_time_start, time) @@ -92,6 +92,14 @@ void change_date_subscribe() def_elt_end); } +void UNREFALLFUNC(change_date)(struct change_date* obj) +{ + if (obj) { + UNREFALLFUNC(note_sub)(obj->note); + UNREFALLFUNC(user_data)(obj->extra); + } +} + void CLEANFUNC(change_date)(struct change_date *chan) { if (chan) { @@ -103,6 +111,51 @@ void CLEANFUNC(change_date)(struct change_date *chan) SAFE_FREE(chan); } +int update_date(struct date_value** dv, struct tm* tm_ptr) +{ + 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; +} + +int update_time(char** tv, struct tm* tm_ptr) +{ + 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; +} + +int gom_update_timestamp(struct change_date** chan, time_t t) +{ + int result = 1; + if (chan) { + if (! *chan) gom_set_new_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); + } + } + return result; +} + int write_change_date(Gedcom_write_hndl hndl, int parent, struct change_date *chan) {