X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gedcom%2Fdate.c;h=e866c809cc9441cc1434fea5ff2b242dbc02541a;hb=236af8be6b2f25bda13b30d2fbb669fa0e9e69d9;hp=a14522ad939e64a71021e8124a0ebb252e6379aa;hpb=d831ac6ddba5b5940e0c3a7a1581e57188d84053;p=gedcom-parse.git diff --git a/gedcom/date.c b/gedcom/date.c index a14522a..e866c80 100644 --- a/gedcom/date.c +++ b/gedcom/date.c @@ -1,5 +1,5 @@ /* Date manipulation routines. - Copyright (C) 2001 The Genes Development Team + Copyright (C) 2001,2002 The Genes Development Team This file is part of the Gedcom parser library. Contributed by Peter Verthez , 2001. @@ -21,9 +21,9 @@ /* $Id$ */ /* $Name$ */ -#include #include "gedcom_internal.h" #include "sdncal.h" +#include "buffer.h" #include "date.h" struct date_value dv_s; @@ -32,6 +32,16 @@ struct date date_s; struct date_value def_date_val; 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 */ @@ -68,7 +78,7 @@ void init_date(struct date *d) } struct date_value make_date_value(Date_value_type t, struct date d1, - struct date d2, char* p) + struct date d2, const char* p) { dv_s.type = t; copy_date(&dv_s.date1, d1); @@ -114,10 +124,11 @@ void make_date_complete(struct date *d) } } -struct date_value gedcom_parse_date(char* line_value) +struct date_value gedcom_parse_date(const char* line_value) { init_date(&date_s); init_date(&def_date); + curr_line_value = line_value; init_gedcom_date_lex(line_value); gedcom_date_parse(); close_gedcom_date_lex(); @@ -126,3 +137,75 @@ struct date_value gedcom_parse_date(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); +}