int compat_enabled = 1;
int compatibility = 0;
-int compat_at = 0;
const char* default_charset = "";
#define SUBMITTER_LINK "@__COMPAT__SUBM__@"
#define DEFAULT_GEDCOM_VERS "5.5"
#define DEFAULT_GEDCOM_FORM "LINEAGE-LINKED"
+enum _COMPAT {
+ C_FTREE = 0x01,
+ C_LIFELINES = 0x02
+};
+
/* Incompatibility list (with GEDCOM 5.5):
- ftree:
- lots of missing required values
*/
+int compat_matrix[] =
+{
+ /* C_NO_SUBMITTER */ C_FTREE | C_LIFELINES,
+ /* C_INDI_ADDR */ C_FTREE,
+ /* C_NOTE_NO_VALUE */ C_FTREE,
+ /* C_NO_GEDC */ C_LIFELINES,
+ /* C_NO_CHAR */ C_LIFELINES,
+ /* C_HEAD_TIME */ C_LIFELINES,
+ /* C_NO_DOUBLE_AT */ C_LIFELINES,
+ /* C_NO_REQUIRED_VALUES */ C_LIFELINES
+};
+
/* Compatibility handling */
void gedcom_set_compat_handling(int enable_compat)
void set_compatibility(const char* program)
{
/* Reinitialize compatibility */
- compat_at = 0;
default_charset = "";
compatibility = 0;
gedcom_warning(_("Enabling compatibility with 'Lifelines'"));
compatibility = C_LIFELINES;
default_charset = "ANSI";
- compat_at = 1;
}
}
}
-int compat_mode(int compat_flags)
+int compat_mode(Compat_rule rule)
{
- return (compat_flags & compatibility);
+ return (compat_matrix[rule] & compatibility);
}
void compat_generate_submitter_link(Gedcom_ctxt parent)
NULL, GEDCOM_MAKE_NULL(val2));
START(HEAD, $1, $<ctxt>$) }
head_subs
- { if (compat_mode(C_FTREE)) {
- CHECK3(SOUR, GEDC, CHAR);
- compat_generate_submitter_link($<ctxt>4);
- }
- else if (compat_mode(C_LIFELINES)) {
- CHECK1(SOUR);
+ { if (compat_mode(C_NO_SUBMITTER))
compat_generate_submitter_link($<ctxt>4);
+ else CHK(SUBM);
+
+ if (compat_mode(C_NO_GEDC))
compat_generate_gedcom($<ctxt>4);
+ else CHK(GEDC);
+
+ if (compat_mode(C_NO_CHAR)) {
if (compat_generate_char($<ctxt>4)) HANDLE_ERROR;
- }
- else
- CHECK4(SOUR, SUBM, GEDC, CHAR)
+ }
+ else CHK(CHAR);
+
+ CHECK1(SOUR);
}
CLOSE
{ end_record(REC_HEAD, $<ctxt>4, GEDCOM_MAKE_NULL(val1));
- if (compat_mode(C_FTREE | C_LIFELINES))
+ if (compat_mode(C_NO_SUBMITTER))
compat_generate_submitter();
}
;
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))
+ | head_time_sect { if (!compat_mode(C_HEAD_TIME))
INVALID_TAG("TIME");
OCCUR2(TIME, 0, 1) }
| head_subm_sect { OCCUR2(SUBM, 1, 1) }
| indi_afn_sect /* 0:M */
| ident_struc_sub /* 0:1 */
| change_date_sub /* 0:1 */
- | ftree_addr_sect { if (!compat_mode(C_FTREE))
+ | indi_addr_sect { if (!compat_mode(C_INDI_ADDR))
INVALID_TAG("ADDR");
}
| no_std_sub
}
;
-/* INDI.ADDR (Only for 'ftree' compatibility) */
-ftree_addr_sect : OPEN DELIM TAG_ADDR opt_line_item
- { if (compat_mode(C_FTREE)) {
+/* INDI.ADDR (Only for compatibility) */
+indi_addr_sect : OPEN DELIM TAG_ADDR opt_line_item
+ { if (compat_mode(C_INDI_ADDR)) {
Gedcom_ctxt par = compat_generate_resi_start(PARENT);
START(RESI, $1, par);
$<ctxt>$
= start_element(ELT_SUB_ADDR,
par, $1 + 1, $3, $4,
GEDCOM_MAKE_NULL_OR_STRING(val2, $4));
- START(ADDR, $1, $<ctxt>$);
+ START(ADDR, $1 + 1, $<ctxt>$);
}
else { START(ADDR, $1, NULL) }
}
ftree_addr_subs
{ CHECK0 }
CLOSE
- { if (compat_mode(C_FTREE)) {
+ { if (compat_mode(C_INDI_ADDR)) {
Gedcom_ctxt par = PARENT;
end_element(ELT_SUB_ADDR, par, $<ctxt>5,
GEDCOM_MAKE_NULL(val1));
;
note_line_item : /* empty */
- { if (!compat_mode(C_FTREE)) {
+ { if (!compat_mode(C_NOTE_NO_VALUE)) {
gedcom_error(_("Missing value")); YYERROR;
}
else {
;
mand_line_item : /* empty */
- { if (compat_mode(C_LIFELINES)) {
+ { if (compat_mode(C_NO_REQUIRED_VALUES)) {
/* Lifelines tends to not care about mandatory values */
gedcom_debug_print("==Val: ==");
$$ = "";