X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gedcom%2Fcompat.c;h=8b5ed50f3e1e8dd414651ee64d7ac9a7282ee89b;hb=a6ae7b8ee65f561b8ba9b189cf3e9504831621da;hp=d4fdb9f480216801f155de5264a8513cefa75dfc;hpb=1168a90285ca948ed7398adc364324339814aea1;p=gedcom-parse.git diff --git a/gedcom/compat.c b/gedcom/compat.c index d4fdb9f..8b5ed50 100644 --- a/gedcom/compat.c +++ b/gedcom/compat.c @@ -30,14 +30,18 @@ int compat_enabled = 1; int compatibility = 0; -int compat_at = 0; -char* default_charset = ""; +const char* default_charset = ""; #define SUBMITTER_LINK "@__COMPAT__SUBM__@" #define DEFAULT_SUBMITTER_NAME "Submitter" #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: @@ -54,6 +58,18 @@ char* default_charset = ""; - 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) @@ -61,10 +77,9 @@ void gedcom_set_compat_handling(int enable_compat) compat_enabled = enable_compat; } -void set_compatibility(char* program) +void set_compatibility(const char* program) { /* Reinitialize compatibility */ - compat_at = 0; default_charset = ""; compatibility = 0; @@ -78,14 +93,13 @@ void set_compatibility(char* program) 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) @@ -126,7 +140,7 @@ void compat_generate_submitter() 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) @@ -168,15 +182,24 @@ int compat_generate_char(Gedcom_ctxt parent) { struct tag_struct ts; Gedcom_ctxt self1; + char* charset; /* first generate "1 CHAR " */ ts.string = "CHAR"; ts.value = TAG_CHAR; - self1 = start_element(ELT_HEAD_CHAR, parent, 1, ts, default_charset, - GEDCOM_MAKE_STRING(val1, 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