X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gedcom%2Fdate.c;h=e866c809cc9441cc1434fea5ff2b242dbc02541a;hb=0a66eda71b0d2f65ee968816b48a9311c17cbf34;hp=1a2232a11f05a54376eec3e59ce7cf5cce4aa40e;hpb=fffe9618ff8a5cfcac207f231b531615dfb0e38f;p=gedcom-parse.git diff --git a/gedcom/date.c b/gedcom/date.c index 1a2232a..e866c80 100644 --- a/gedcom/date.c +++ b/gedcom/date.c @@ -23,6 +23,7 @@ #include "gedcom_internal.h" #include "sdncal.h" +#include "buffer.h" #include "date.h" struct date_value dv_s; @@ -33,6 +34,14 @@ struct date def_date; const char* curr_line_value; +void cleanup_date_buffer(); +struct safe_buffer date_buffer = { NULL, 0, NULL, 0, cleanup_date_buffer }; + +void cleanup_date_buffer() +{ + cleanup_buffer(&date_buffer); +} + int max_month[] = { 12, /* CAL_GREGORIAN */ 12, /* CAL_JULIAN */ 13, /* CAL_HEBREW */ @@ -128,3 +137,75 @@ struct date_value gedcom_parse_date(const char* line_value) return dv_s; } +void add_date(struct date* d) +{ + switch (d->cal) { + case CAL_GREGORIAN: break; + case CAL_JULIAN: + safe_buf_append(&date_buffer, "@#DJULIAN@ "); break; + case CAL_HEBREW: + safe_buf_append(&date_buffer, "@#DHEBREW@ "); break; + case CAL_FRENCH_REV: + safe_buf_append(&date_buffer, "@#DFRENCH R@ "); break; + case CAL_UNKNOWN: + safe_buf_append(&date_buffer, "@#DUNKNOWN@ "); break; + default: + break; + } + if (d->day_str[0]) + safe_buf_append(&date_buffer, "%s ", d->day_str); + if (d->month_str[0]) + safe_buf_append(&date_buffer, "%s ", d->month_str); + safe_buf_append(&date_buffer, "%s", d->year_str); +} + +char* gedcom_date_to_string(struct date_value* val) +{ + reset_buffer(&date_buffer); + + switch (val->type) { + case DV_NO_MODIFIER: + add_date(&val->date1); break; + case DV_BEFORE: + safe_buf_append(&date_buffer, "BEF "); + add_date(&val->date1); break; + case DV_AFTER: + safe_buf_append(&date_buffer, "AFT "); + add_date(&val->date1); break; + case DV_BETWEEN: + safe_buf_append(&date_buffer, "BET "); + add_date(&val->date1); + safe_buf_append(&date_buffer, " AND "); + add_date(&val->date2); break; + case DV_FROM: + safe_buf_append(&date_buffer, "FROM "); + add_date(&val->date1); break; + case DV_TO: + safe_buf_append(&date_buffer, "TO "); + add_date(&val->date1); break; + case DV_FROM_TO: + safe_buf_append(&date_buffer, "FROM "); + add_date(&val->date1); + safe_buf_append(&date_buffer, " TO "); + add_date(&val->date2); break; + case DV_ABOUT: + safe_buf_append(&date_buffer, "ABT "); + add_date(&val->date1); break; + case DV_CALCULATED: + safe_buf_append(&date_buffer, "CAL "); + add_date(&val->date1); break; + case DV_ESTIMATED: + safe_buf_append(&date_buffer, "EST "); + add_date(&val->date1); break; + case DV_INTERPRETED: + safe_buf_append(&date_buffer, "INT "); + add_date(&val->date1); + safe_buf_append(&date_buffer, " (%s)", val->phrase); break; + case DV_PHRASE: + safe_buf_append(&date_buffer, "(%s)", val->phrase); break; + default: + break; + } + + return get_buf_string(&date_buffer); +}