Move all compatibility handling functions to compat.c; let the default
[gedcom-parse.git] / gedcom / gedcom.y
index 48847192e1ed1ed8a7d0d1b8e7abdb3bdd848923..f305257db49f2f0f6e59a7c1db9c17c4347036ca 100644 (file)
 
 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 +159,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 +168,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 +251,7 @@ int  compat_mode(int flags);
 }
 
 %token_table
-%expect 303
+%expect 304
 
 %token <string> BADTOKEN
 %token <number> OPEN
@@ -452,12 +444,18 @@ head_sect    : OPEN DELIM TAG_HEAD
                   CHECK3(SOUR, GEDC, CHAR);
                   compat_generate_submitter_link($<ctxt>4);
                 }
+                else if (compat_mode(C_LIFELINES)) {
+                  CHECK1(SOUR);
+                  compat_generate_submitter_link($<ctxt>4);
+                  compat_generate_gedcom($<ctxt>4);
+                  if (compat_generate_char($<ctxt>4)) YYABORT;
+                }
                 else
                   CHECK4(SOUR, SUBM, GEDC, CHAR)
               }
                CLOSE
                { end_record(REC_HEAD, $<ctxt>4);
-                if (compat_mode(C_FTREE))
+                if (compat_mode(C_FTREE | C_LIFELINES))
                   compat_generate_submitter();
               }
              ;
@@ -469,6 +467,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 +661,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
+              ;
+
 /* HEAD.SUBM */
 head_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
                  { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
@@ -3545,7 +3553,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 +3899,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);
-}
-