X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gedcom%2Fdate.c;h=9c086e7e2494ccb4de39d7517826ff574acbe710;hb=d2dbc2834cae06a5de0dec22c0e7a530b7dd1589;hp=5deab785aa17884439e64bf1ffa59849bd680a89;hpb=4a4c63a19ac9962669b70f9c073cfb3801aec781;p=gedcom-parse.git diff --git a/gedcom/date.c b/gedcom/date.c index 5deab78..9c086e7 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,14 +329,14 @@ 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 { if (d->day != -1) sprintf(d->day_str, "%d", d->day); - if (d->month != -1) + if (d->month > 0 && d->month <= max_month[d->cal]) strcpy(d->month_str, month_name[d->cal][d->month - 1]); if (d->year_type == YEAR_SINGLE) @@ -379,7 +383,7 @@ int gedcom_normalize_date(Date_input input, struct date_value *val) return result; } -struct date_value* gedcom_new_date_value(struct date_value* copy_from) +struct date_value* gedcom_new_date_value(const struct date_value* copy_from) { struct date_value* dv_ptr; dv_ptr = (struct date_value*) malloc(sizeof(struct date_value)); @@ -400,20 +404,34 @@ 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(&dv_s.date1); + init_date(&dv_s.date2); 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, VALUE_IF_MISSING, 2)) { + gedcom_date_error(_("Empty value changed to '%s'"), VALUE_IF_MISSING); + 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, &dv_s.date1, &dv_s.date2, curr_line_value); + } return dv_s; } -void write_date(struct date* d) +void write_date(const struct date* d) { if (! d->year_str[0] || d->year <= 0 || d->sdn1 <= 0) gedcom_error(_("Date is not normalized: some fields are invalid")); @@ -439,7 +457,7 @@ void write_date(struct date* d) } } -char* gedcom_date_to_string(struct date_value* val) +char* gedcom_date_to_string(const struct date_value* val) { init_buffer(&date_buffer); reset_buffer(&date_buffer);