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)
end_element(ELT_SUBM_NAME, self1, self2, NULL);
/* close "0 SUBM" */
- end_record(REC_SUBM, self1);
+ end_record(REC_SUBM, self1, NULL);
}
void compat_generate_gedcom(Gedcom_ctxt parent)
{
struct tag_struct ts;
Gedcom_ctxt self1;
+ char* charset;
/* first generate "1 CHAR <DEFAULT_CHAR>" */
ts.string = "CHAR";
ts.value = TAG_CHAR;
- self1 = start_element(ELT_HEAD_CHAR, parent, 1, ts, (char*)default_charset,
- GEDCOM_MAKE_STRING(val1, (char*)default_charset));
-
- /* close "1 CHAR" */
- end_element(ELT_HEAD_CHAR, parent, self1, NULL);
+
+ /* Must strdup, because default_charset is const char */
+ charset = strdup(default_charset);
+ if (! charset)
+ MEMORY_ERROR;
+ else {
+ self1 = start_element(ELT_HEAD_CHAR, parent, 1, ts, charset,
+ GEDCOM_MAKE_STRING(val1, charset));
+ free(charset);
+
+ /* close "1 CHAR" */
+ end_element(ELT_HEAD_CHAR, parent, self1, NULL);
+ }
if (open_conv_to_internal(default_charset) == 0)
return 1;
else