X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gedcom%2Fgedcom.y;h=3d5243a90c068fd68a39235adf3479db1b6e878b;hb=37394dd1d49e67022fb7a9afec2d830695e3d10d;hp=48847192e1ed1ed8a7d0d1b8e7abdb3bdd848923;hpb=79269c03d231d3d2a564f77072d466f23cfc42c0;p=gedcom-parse.git diff --git a/gedcom/gedcom.y b/gedcom/gedcom.y index 4884719..3d5243a 100644 --- a/gedcom/gedcom.y +++ b/gedcom/gedcom.y @@ -146,14 +146,13 @@ #include "encoding.h" #include "interface.h" #include "date.h" +#include "age.h" #include "xref.h" #include "compat.h" int count_level = 0; int fail = 0; -int compat_enabled = 1; int gedcom_high_level_debug = 0; -int compatibility = 0; Gedcom_err_mech error_mechanism = IMMED_FAIL; Gedcom_val_struct val1; Gedcom_val_struct val2; @@ -161,10 +160,6 @@ Gedcom_val_struct val2; char line_item_buf[MAXGEDCLINELEN * UTF_FACTOR + 1]; char *line_item_buf_ptr; -enum _COMPAT { - C_FTREE = 0x01 -}; - /* These are defined at the bottom of the file */ void push_countarray(); void set_parenttag(char* tag); @@ -174,8 +169,6 @@ Gedcom_ctxt get_parentctxt(int offset); void pop_countarray(); int count_tag(int tag); int check_occurrence(int tag); -void set_compatibility(char* program); -int compat_mode(int flags); #define CLEAR_BUFFER(BUF) \ memset(BUF, 0, sizeof(BUF)); @@ -259,7 +252,7 @@ int compat_mode(int flags); } %token_table -%expect 303 +%expect 304 %token BADTOKEN %token OPEN @@ -452,12 +445,18 @@ head_sect : OPEN DELIM TAG_HEAD CHECK3(SOUR, GEDC, CHAR); compat_generate_submitter_link($4); } + else if (compat_mode(C_LIFELINES)) { + CHECK1(SOUR); + compat_generate_submitter_link($4); + compat_generate_gedcom($4); + if (compat_generate_char($4)) YYABORT; + } else CHECK4(SOUR, SUBM, GEDC, CHAR) } CLOSE { end_record(REC_HEAD, $4); - if (compat_mode(C_FTREE)) + if (compat_mode(C_FTREE | C_LIFELINES)) compat_generate_submitter(); } ; @@ -469,6 +468,9 @@ head_subs : /* empty */ head_sub : head_sour_sect { OCCUR2(SOUR, 1, 1) } | head_dest_sect { OCCUR2(DEST, 0, 1) } | head_date_sect { OCCUR2(DATE, 0, 1) } + | head_time_sect { if (!compat_mode(C_LIFELINES)) + INVALID_TAG("TIME"); + OCCUR2(TIME, 0, 1) } | head_subm_sect { OCCUR2(SUBM, 1, 1) } | head_subn_sect { OCCUR2(SUBN, 0, 1) } | head_file_sect { OCCUR2(FILE, 0, 1) } @@ -660,6 +662,13 @@ head_date_time_sect : OPEN DELIM TAG_TIME mand_line_item } ; +/* HEAD.TIME (Only for 'Lifelines' compatibility) */ +/* Just ignore the time... */ +head_time_sect : OPEN DELIM TAG_TIME opt_line_item CLOSE + { gedcom_warning(_("Header change time lost in the compatibility")); + } + ; + /* HEAD.SUBM */ head_subm_sect : OPEN DELIM TAG_SUBM mand_pointer { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED, @@ -2006,7 +2015,7 @@ assoc_struc_sub : asso_sect /* 0:M */ asso_sect : OPEN DELIM TAG_ASSO mand_pointer { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED, - XREF_INDI); + XREF_ANY); if (xr == NULL) HANDLE_ERROR; $$ = start_element(ELT_SUB_ASSO, PARENT, $1, $3, $4, @@ -2233,10 +2242,11 @@ event_detail_date_sect : OPEN DELIM TAG_DATE mand_line_item } ; event_detail_age_sect : OPEN DELIM TAG_AGE mand_line_item - { $$ + { struct age_value age = gedcom_parse_age($4); + $$ = start_element(ELT_SUB_EVT_AGE, PARENT, $1, $3, $4, - GEDCOM_MAKE_STRING(val1, $4)); + GEDCOM_MAKE_AGE(val1, age)); START(AGE, $$) } no_std_subs @@ -2339,9 +2349,10 @@ fam_even_husb_sub : fam_even_age_sect { OCCUR2(AGE, 1, 1) } ; fam_even_age_sect : OPEN DELIM TAG_AGE mand_line_item - { $$ = start_element(ELT_SUB_FAM_EVT_AGE, + { struct age_value age = gedcom_parse_age($4); + $$ = start_element(ELT_SUB_FAM_EVT_AGE, PARENT, $1, $3, $4, - GEDCOM_MAKE_STRING(val1, $4)); + GEDCOM_MAKE_AGE(val1, age)); START(AGE, $$) } no_std_subs @@ -3545,7 +3556,16 @@ mand_pointer : /* empty */ { gedcom_error(_("Missing pointer")); YYERROR; } $$ = $2; } ; -mand_line_item : /* empty */ { gedcom_error(_("Missing value")); YYERROR; } +mand_line_item : /* empty */ + { if (compat_mode(C_LIFELINES)) { + /* Lifelines tends to not care about mandatory values */ + gedcom_debug_print("==Val: =="); + $$ = ""; + } + else { + gedcom_error(_("Missing value")); YYERROR; + } + } | DELIM line_item { gedcom_debug_print("==Val: %s==", $2); $$ = $2; } ; @@ -3882,29 +3902,3 @@ void gedcom_set_error_handling(Gedcom_err_mech mechanism) { error_mechanism = mechanism; } - -/* Compatibility handling */ - -void gedcom_set_compat_handling(int enable_compat) -{ - compat_enabled = enable_compat; -} - -void set_compatibility(char* program) -{ - if (compat_enabled) { - if (! strncmp(program, "ftree", 6)) { - gedcom_warning(_("Enabling compatibility with 'ftree'")); - compatibility = C_FTREE; - } - else { - compatibility = 0; - } - } -} - -int compat_mode(int compat_flags) -{ - return (compat_flags & compatibility); -} -