X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gedcom%2Fdate.c;h=4f61ccabbeace3c45f69f80671efc789203e12ad;hb=359ac00a8a5a1d69804380ff5c97c3d01036d1a9;hp=5deab785aa17884439e64bf1ffa59849bd680a89;hpb=4a4c63a19ac9962669b70f9c073cfb3801aec781;p=gedcom-parse.git diff --git a/gedcom/date.c b/gedcom/date.c index 5deab78..4f61cca 100644 --- a/gedcom/date.c +++ b/gedcom/date.c @@ -24,6 +24,8 @@ #include "gedcom_internal.h" #include "sdncal.h" #include "buffer.h" +#include "compat.h" +#include #include "date.h" struct date_value dv_s; @@ -106,9 +108,9 @@ int checkedSdnToCal(Calendar_type cal, long int sdn, return 0; } -void copy_date(struct date *to, struct date from) +void copy_date(struct date *to, struct date *from) { - memcpy(to, &from, sizeof(struct date)); + memcpy(to, from, sizeof(struct date)); } void init_date(struct date *d) @@ -126,14 +128,14 @@ void init_date(struct date *d) d->sdn2 = -1; } -struct date_value make_date_value(Date_value_type t, struct date d1, - struct date d2, const char* p) +struct date_value* make_date_value(Date_value_type t, struct date *d1, + struct date *d2, const char* p) { dv_s.type = t; copy_date(&dv_s.date1, d1); copy_date(&dv_s.date2, d2); strncpy(dv_s.phrase, p, MAX_PHRASE_LEN + 1); - return dv_s; + return &dv_s; } /* PRE: d->cal != CAL_UNKNOWN @@ -145,16 +147,16 @@ int numbers_to_sdn(struct date *d) int result = 0; if (d->cal == CAL_UNKNOWN) { d->type = DATE_UNRECOGNIZED; - gedcom_error(_("Cannot compute SDN for unknown calendar type")); + gedcom_date_error(_("Cannot compute SDN for unknown calendar type")); result = 1; } else { struct date begin_date; struct date end_date; - copy_date(&begin_date, *d); + copy_date(&begin_date, d); if (d->day == -1 || d->month == -1 || d->year == -1) { d->type = DATE_BOUNDED; - copy_date(&end_date, *d); + copy_date(&end_date, d); if (begin_date.month == -1) { begin_date.month = 1; end_date.month = 1; begin_date.day = 1; end_date.day = 1; @@ -169,7 +171,7 @@ int numbers_to_sdn(struct date *d) } } else { - gedcom_error(_("Year has to be given in bounded date")); + gedcom_date_error(_("Year has to be given in bounded date")); result = 1; } } @@ -180,7 +182,8 @@ int numbers_to_sdn(struct date *d) d->sdn1 = checkedCalToSdn(d->cal, begin_date.year, begin_date.month, begin_date.day); if (d->sdn1 == -1) { - gedcom_error(_("Error converting date")); + gedcom_date_error(_("Error converting date: year %d, month %d, day %d"), + begin_date.year, begin_date.month, begin_date.day); result = 1; } else @@ -188,7 +191,8 @@ int numbers_to_sdn(struct date *d) d->sdn2 = checkedCalToSdn(d->cal, end_date.year, end_date.month, end_date.day); if (d->sdn2 == -1) { - gedcom_error(_("Error converting date")); + gedcom_date_error(_("Error converting date: year %d, month %d, day %d"), + end_date.year, end_date.month, end_date.day); result = 1; } else @@ -206,7 +210,7 @@ int sdn_to_numbers(struct date *d) { int result = 0; if (d->cal == CAL_UNKNOWN) { - gedcom_error(_("Cannot compute from SDN for unknown calendar type")); + gedcom_date_error(_("Cannot compute from SDN for unknown calendar type")); result = 1; } else { @@ -214,38 +218,38 @@ int sdn_to_numbers(struct date *d) struct date end_date; if (d->sdn1 <= 0) { - gedcom_error(_("SDN 1 should be bigger than zero")); + gedcom_date_error(_("SDN 1 should be bigger than zero")); result = 1; } else { - copy_date(&begin_date, *d); + copy_date(&begin_date, d); if (!checkedSdnToCal(d->cal, d->sdn1, &begin_date.year, &begin_date.month, &begin_date.day)) { - gedcom_error(_("SDN 1 isn't a valid date in the given calendar")); + gedcom_date_error(_("SDN 1 isn't a valid date in the given calendar")); result = 1; } else { switch (d->type) { case DATE_EXACT: if (d->sdn2 != -1) { - gedcom_error(_("SDN 2 should be -1 for exact dates")); + gedcom_date_error(_("SDN 2 should be -1 for exact dates")); result = 1; } break; case DATE_BOUNDED: if (d->sdn2 <= 0) { - gedcom_error(_("SDN 2 should be bigger than zero")); + gedcom_date_error(_("SDN 2 should be bigger than zero")); result = 1; } else if (d->sdn2 <= d->sdn1) { - gedcom_error(_("SDN 2 should be bigger than SDN 1")); + gedcom_date_error(_("SDN 2 should be bigger than SDN 1")); result = 1; } else { - copy_date(&end_date, *d); + copy_date(&end_date, d); if (!checkedSdnToCal(d->cal, d->sdn2, &end_date.year, &end_date.month, &end_date.day)) { - gedcom_error(_("SDN 2 isn't a valid date in the given calendar")); + gedcom_date_error(_("SDN 2 isn't a valid date in the given calendar")); result = 1; } else { @@ -266,7 +270,7 @@ int sdn_to_numbers(struct date *d) } } else { - gedcom_error(_("SDN1/SDN2 isn't a bounded date")); + gedcom_date_error(_("SDN1/SDN2 isn't a bounded date")); result = 1; } } @@ -292,7 +296,7 @@ int strings_to_numbers(struct date *d) { int result = 0; if (d->cal == CAL_UNKNOWN) { - gedcom_error(_("Cannot compute months for unknown calendar type")); + gedcom_date_error(_("Cannot compute months for unknown calendar type")); result = 1; } else { @@ -325,7 +329,7 @@ int numbers_to_strings(struct date *d) { int result = 0; if (d->cal == CAL_UNKNOWN) { - gedcom_error(_("Cannot compute month names for unknown calendar type")); + gedcom_date_error(_("Cannot compute month names for unknown calendar type")); result = 1; } else { @@ -400,16 +404,28 @@ struct date_value* gedcom_new_date_value(struct date_value* copy_from) struct date_value gedcom_parse_date(const char* line_value) { + int result = 0; 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(); - if (dv_s.date1.cal != CAL_UNKNOWN) - numbers_to_sdn(&dv_s.date1); - if (dv_s.date2.cal != CAL_UNKNOWN) - numbers_to_sdn(&dv_s.date2); + if (compat_mode(C_NO_REQUIRED_VALUES) + && !strncmp(curr_line_value, "-", 2)) { + gedcom_date_error(_("Empty value changed to '-'")); + result = 1; + } + else { + init_gedcom_date_lex(line_value); + gedcom_date_parse(); + close_gedcom_date_lex(); + if (dv_s.date1.cal != CAL_UNKNOWN) + result |= numbers_to_sdn(&dv_s.date1); + if (dv_s.date2.cal != CAL_UNKNOWN) + result |= numbers_to_sdn(&dv_s.date2); + } + if (result != 0) { + gedcom_date_error(_("Putting date in 'phrase' member")); + make_date_value(DV_PHRASE, &def_date, &def_date, curr_line_value); + } return dv_s; }