X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gedcom%2Fgedcom_date.y;h=79af990babef29e10739ac7c5fdfaec3744f3e53;hb=46dbcde598caae3e8026235a0de211eb529cad03;hp=022b624df55b09812c331a861fbc04ba4f4163d8;hpb=8c5c11bd65273224b6b0b46762a27922602c4c58;p=gedcom-parse.git diff --git a/gedcom/gedcom_date.y b/gedcom/gedcom_date.y index 022b624..79af990 100644 --- a/gedcom/gedcom_date.y +++ b/gedcom/gedcom_date.y @@ -28,6 +28,8 @@ int _get_day_num(const char* input); int _get_year_num(Year_type ytype, const char* input1, const char* input2); +void error_missing_year(); +void error_missing_month(); %} @@ -124,8 +126,10 @@ date_value : date { make_date_value(DV_NO_MODIFIER, } | error { /* On error: put entire string in 'phrase' member as fallback */ + gedcom_date_error(_("Putting date '%s' in 'phrase' member"), curr_line_value); make_date_value(DV_PHRASE, &def_date, &def_date, curr_line_value); + YYABORT; } ; @@ -177,21 +181,33 @@ date_phrase : OPEN TEXT CLOSE { $$ = $2; } date_greg : day month_greg year_greg | month_greg year_greg | year_greg + | day month_greg { error_missing_year(); YYERROR; } + | month_greg { error_missing_year(); YYERROR; } + | day year_greg { error_missing_month(); YYERROR; } ; date_juln : day month_greg year | month_greg year | year + | day month_greg { error_missing_year(); YYERROR; } + | month_greg { error_missing_year(); YYERROR; } + | day year_greg { error_missing_month(); YYERROR; } ; date_hebr : day month_hebr year | month_hebr year | year + | day month_hebr { error_missing_year(); YYERROR; } + | month_hebr { error_missing_year(); YYERROR; } + | day year { error_missing_month(); YYERROR; } ; date_fren : day month_fren year | month_fren year | year + | day month_hebr { error_missing_year(); YYERROR; } + | month_hebr { error_missing_year(); YYERROR; } + | day year { error_missing_month(); YYERROR; } ; day : NUMBER @@ -201,6 +217,7 @@ day : NUMBER strcpy(date_s.day_str, $1); date_s.day = d; } + else YYERROR; } ; @@ -293,6 +310,7 @@ year : NUMBER date_s.year = y; date_s.year_type = YEAR_SINGLE; } + else YYERROR; } ; @@ -303,19 +321,39 @@ year_greg : NUMBER date_s.year = y; date_s.year_type = YEAR_SINGLE; } + else YYERROR; } | NUMBER SLASH NUMBER - { int y = _get_year_num(YEAR_DOUBLE, $1, $3); - if (y != -1) { - sprintf(date_s.year_str, "%d/%d", y-1, y%100); - date_s.year = y; - date_s.year_type = YEAR_DOUBLE; + { if (compat_double_date_check($3)) { + safe_buf_append(&compat_buffer, "BET %s AND %s", + $1, $3); + } + else { + int y = _get_year_num(YEAR_DOUBLE, $1, $3); + if (y != -1) { + sprintf(date_s.year_str, "%d/%02d", y-1, y%100); + date_s.year = y; + date_s.year_type = YEAR_DOUBLE; + } + else YYERROR; } } ; %% +void error_missing_year() +{ + gedcom_date_error(_("Year is missing: '%s'"), + curr_line_value); +} + +void error_missing_month() +{ + gedcom_date_error(_("Month is missing: '%s'"), + curr_line_value); +} + int _get_day_num(const char* input) { if (strlen(input) <= MAX_DAY_LEN) @@ -376,14 +414,9 @@ int _get_year_num(Year_type ytype, const char* input1, const char* input2) } else { if (strlen(input2) != 2) { - if (compat_mode(C_DOUBLE_DATES_4) && strlen(input2) == 4) { - input2 += 2; - } - else { - gedcom_date_error(_("Year after slash should be two digits: '%s/%s'"), - input1, input2); - return -1; - } + gedcom_date_error(_("Year after slash should be two digits: '%s/%s'"), + input1, input2); + return -1; } if (strlen(input1) <= MAX_YEAR_LEN - 3) { int year1 = atoi(input1) + 1;