Copied from old documentation. Removed all Gedcom_val details.
[gedcom-parse.git] / gedcom / gedcom.y
index 41c59359fe3fb73cd5191ac726f64e31040a4476..5448c74b89e26a3d6207e0fa33b37f9b5cb86aae 100644 (file)
@@ -185,6 +185,7 @@ void clean_up();
         clean_up(); YYABORT;                                                 \
        }                                                                      \
        else if (error_mechanism == DEFER_FAIL) {                              \
+         gedcom_debug_print("Fail on line %d", line_no);                      \
          yyerrok; fail = 1;                                                   \
        }                                                                      \
        else if (error_mechanism == IGNORE_ERRORS) {                           \
@@ -261,7 +262,7 @@ void clean_up();
 }
 
 %token_table
-%expect 309
+%expect 317
 
 %token <string> BADTOKEN
 %token <number> OPEN
@@ -421,9 +422,13 @@ void clean_up();
 %%
 
 file        : head_sect records trlr_sect
-               { if (fail == 1) YYABORT; }
+               { compat_close();
+                if (fail == 1) YYABORT;
+              }
             | error
-               { clean_up(); }
+               { compat_close();
+                clean_up();
+              }
             ;
 
 records     : /* empty */
@@ -646,6 +651,8 @@ head_date_sect : OPEN DELIM TAG_DATE mand_line_item
                   $<ctxt>$ = start_element(ELT_HEAD_DATE,
                                            PARENT, $1, $3, $4,
                                            GEDCOM_MAKE_DATE(val1, dv));
+                  if (compat_mode(C_HEAD_TIME))
+                    compat_save_head_date_context($<ctxt>$);
                   START(DATE, $1, $<ctxt>$)
                 }
                  head_date_subs
@@ -679,9 +686,15 @@ head_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
                     ;
 
 /* HEAD.TIME (Only for 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_time_sect : OPEN DELIM TAG_TIME opt_line_item
+                 { if (compat_mode(C_HEAD_TIME)) {
+                    $<ctxt>$ = compat_generate_head_time_start($1, $3, $4);
+                   }
+                 }
+                 CLOSE
+                 { if (compat_mode (C_HEAD_TIME)) {
+                    compat_generate_head_time_end($<ctxt>5);
+                  }
                  }
               ;
 
@@ -1542,6 +1555,24 @@ sour_sub    : sour_data_sect  { OCCUR2(DATA, 0, 1) }
             | sour_abbr_sect  { OCCUR2(ABBR, 0, 1) }
             | sour_publ_sect  { OCCUR2(PUBL, 0, 1) }
             | sour_text_sect  { OCCUR2(TEXT, 0, 1) }
+            | sour_type_sect  { if (!compat_mode(C_NONSTD_SOUR_TAGS))
+                                 INVALID_TAG("TYPE");
+                               OCCUR2(TYPE, 0, 1) }
+            | sour_file_sect  { if (!compat_mode(C_NONSTD_SOUR_TAGS))
+                                 INVALID_TAG("FILE");
+                               OCCUR2(FILE, 0, 1) }
+            | sour_plac_sect  { if (!compat_mode(C_NONSTD_SOUR_TAGS))
+                                 INVALID_TAG("PLAC");
+                               OCCUR2(PLAC, 0, 1) }
+            | sour_date_sect  { if (!compat_mode(C_NONSTD_SOUR_TAGS))
+                                 INVALID_TAG("DATE");
+                               OCCUR2(DATE, 0, 1) }
+            | sour_medi_sect  { if (!compat_mode(C_NONSTD_SOUR_TAGS))
+                                 INVALID_TAG("MEDI");
+                               OCCUR2(MEDI, 0, 1) }
+            | sour_page_sect  { if (!compat_mode(C_NONSTD_SOUR_TAGS))
+                                 INVALID_TAG("PAGE");
+                               OCCUR2(PAGE, 0, 1) }
             | source_repos_cit_sub  /* 0:1 */
             | multim_link_sub  /* 0:M */
             | note_struc_sub  /* 0:M */
@@ -1762,6 +1793,90 @@ sour_text_sub  : continuation_sub  /* 0:M */
                | no_std_sub
                ;
 
+/* Only for compatibility */
+sour_type_sect : OPEN DELIM TAG_TYPE opt_line_item  
+                 { if (compat_mode(C_NONSTD_SOUR_TAGS)) {
+                    $<ctxt>$ =
+                      compat_generate_nonstd_sour_start(PARENT, $1, $3, $4,
+                                                        &usertag_buffer);
+                  }
+                 }
+                 CLOSE            
+                 { if (compat_mode(C_NONSTD_SOUR_TAGS))
+                    compat_generate_nonstd_sour_end(PARENT, $<ctxt>5);
+                }
+               ;
+
+/* Only for compatibility */
+sour_file_sect : OPEN DELIM TAG_FILE opt_line_item  
+                 { if (compat_mode(C_NONSTD_SOUR_TAGS)) {
+                    $<ctxt>$ =
+                      compat_generate_nonstd_sour_start(PARENT, $1, $3, $4,
+                                                        &usertag_buffer);
+                  }
+                 }
+                 CLOSE            
+                 { if (compat_mode(C_NONSTD_SOUR_TAGS))
+                    compat_generate_nonstd_sour_end(PARENT, $<ctxt>5);
+                }
+               ;
+
+/* Only for compatibility */
+sour_plac_sect : OPEN DELIM TAG_PLAC opt_line_item  
+                 { if (compat_mode(C_NONSTD_SOUR_TAGS)) {
+                    $<ctxt>$ =
+                      compat_generate_nonstd_sour_start(PARENT, $1, $3, $4,
+                                                        &usertag_buffer);
+                  }
+                 }
+                 CLOSE            
+                 { if (compat_mode(C_NONSTD_SOUR_TAGS))
+                    compat_generate_nonstd_sour_end(PARENT, $<ctxt>5);
+                }
+               ;
+
+/* Only for compatibility */
+sour_date_sect : OPEN DELIM TAG_DATE opt_line_item  
+                 { if (compat_mode(C_NONSTD_SOUR_TAGS)) {
+                    $<ctxt>$ =
+                      compat_generate_nonstd_sour_start(PARENT, $1, $3, $4,
+                                                        &usertag_buffer);
+                  }
+                 }
+                 CLOSE            
+                 { if (compat_mode(C_NONSTD_SOUR_TAGS))
+                    compat_generate_nonstd_sour_end(PARENT, $<ctxt>5);
+                }
+               ;
+
+/* Only for compatibility */
+sour_medi_sect : OPEN DELIM TAG_MEDI opt_line_item  
+                 { if (compat_mode(C_NONSTD_SOUR_TAGS)) {
+                    $<ctxt>$ =
+                      compat_generate_nonstd_sour_start(PARENT, $1, $3, $4,
+                                                        &usertag_buffer);
+                  }
+                 }
+                 CLOSE            
+                 { if (compat_mode(C_NONSTD_SOUR_TAGS))
+                    compat_generate_nonstd_sour_end(PARENT, $<ctxt>5);
+                }
+               ;
+
+/* Only for compatibility */
+sour_page_sect : OPEN DELIM TAG_PAGE opt_line_item  
+                 { if (compat_mode(C_NONSTD_SOUR_TAGS)) {
+                    $<ctxt>$ =
+                      compat_generate_nonstd_sour_start(PARENT, $1, $3, $4,
+                                                        &usertag_buffer);
+                  }
+                 }
+                 CLOSE            
+                 { if (compat_mode(C_NONSTD_SOUR_TAGS))
+                    compat_generate_nonstd_sour_end(PARENT, $<ctxt>5);
+                }
+               ;
+
 /*********************************************************************/
 /**** Submission record                                           ****/
 /*********************************************************************/
@@ -1911,11 +2026,14 @@ submit_rec : OPEN DELIM POINTER DELIM TAG_SUBM
               $<ctxt>$ = start_record(REC_SUBM,
                                       $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
                                       NULL, GEDCOM_MAKE_NULL(val2));
-               START(SUBM, $1, $<ctxt>$) }
+              START(SUBM, $1, $<ctxt>$) }
              subm_subs
             { CHECK1(NAME) }
              CLOSE
-             { end_record(REC_SUBM, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
+             { end_record(REC_SUBM, $<ctxt>6, GEDCOM_MAKE_NULL(val1));
+              if (compat_mode(C_SUBM_CTRY))
+                compat_free_ctry_parent_context();
+            }
            ;
 
 subm_subs  : /* empty */
@@ -1929,6 +2047,9 @@ subm_sub   : subm_name_sect  { OCCUR2(NAME, 1, 1) }
            | subm_rfn_sect  { OCCUR2(RFN, 0, 1) }
            | subm_rin_sect  { OCCUR2(RIN, 0, 1) }
            | change_date_sub  /* 0:1 */
+          | subm_ctry_sect  { if (!compat_mode(C_SUBM_CTRY))
+                                 INVALID_TAG("CTRY");
+                              OCCUR2(CTRY, 0, 1) }
            | no_std_sub
            ;
 
@@ -1992,6 +2113,19 @@ subm_rin_sect  : OPEN DELIM TAG_RIN mand_line_item
                 }
                ;
 
+/* SUBM.CTRY (Only for compatibility) */
+subm_ctry_sect : OPEN DELIM TAG_CTRY opt_line_item
+                 { if (compat_mode(C_SUBM_CTRY)) {
+                    $<ctxt>$ = compat_generate_addr_ctry_start($1, $3, $4);
+                   }
+                 }
+                 CLOSE
+                 { if (compat_mode (C_SUBM_CTRY)) {
+                    compat_generate_addr_ctry_end($<ctxt>5);
+                  }
+                 }
+              ;
+
 /*********************************************************************/
 /**** Substructures                                               ****/
 /*********************************************************************/
@@ -2007,7 +2141,9 @@ addr_sect   : OPEN DELIM TAG_ADDR mand_line_item
                                         GEDCOM_MAKE_STRING(val1, $4));
                reset_buffer(&concat_buffer);
                safe_buf_append(&concat_buffer, $4);
-               START(ADDR, $1, $<ctxt>$)  
+               START(ADDR, $1, $<ctxt>$);
+               if (compat_mode(C_SUBM_CTRY))
+                 compat_save_ctry_parent_context($<ctxt>$);
               }
               addr_subs
              { CHECK0 }
@@ -2319,7 +2455,7 @@ cont_sect : OPEN DELIM TAG_CONT opt_line_item
                safe_buf_append(&concat_buffer, $4);
              START(CONT, $1, $<ctxt>$)  
             }  
-            no_std_subs  
+            cont_conc_subs  
             { CHECK0 }  
             CLOSE  
             { end_element(ELT_SUB_CONT, PARENT, $<ctxt>5,
@@ -2337,7 +2473,7 @@ conc_sect : OPEN DELIM TAG_CONC mand_line_item
              safe_buf_append(&concat_buffer, $4);
              START(CONC, $1, $<ctxt>$)  
             }  
-            no_std_subs  
+            cont_conc_subs  
             { CHECK0 }  
             CLOSE  
             { end_element(ELT_SUB_CONC, PARENT, $<ctxt>5,
@@ -2345,6 +2481,33 @@ conc_sect : OPEN DELIM TAG_CONC mand_line_item
            }
           ; 
 
+cont_conc_subs : /* empty */
+               | cont_conc_subs cont_conc_sub
+               ;
+
+cont_conc_sub  : cont_conc_sour_sect { if (!compat_mode(C_NOTE_CONC_SOUR))
+                                        INVALID_TAG("SOUR");
+                                      OCCUR2(SOUR, 0, 1) } 
+               | no_std_sub
+              ;
+
+/* Only for compatibility */
+cont_conc_sour_sect : OPEN DELIM TAG_SOUR DELIM POINTER
+                      { if (compat_mode(C_NOTE_CONC_SOUR)) {
+                         $<ctxt>$
+                           = compat_generate_note_sour_start(GRANDPARENT(1),
+                                                             $1, $3, $5);
+                         if ($<ctxt>$ == (void*)-1) HANDLE_ERROR;
+                        }
+                      }
+                      no_std_subs
+                      CLOSE
+                      { if (compat_mode(C_NOTE_CONC_SOUR)) {
+                         compat_generate_note_sour_end($<ctxt>6);
+                       }
+                      }
+                     ;
+
 /* EVENT DETAIL */
 event_detail_sub : event_detail_type_sect  { OCCUR2(TYPE, 0, 1) }
                  | event_detail_date_sect  { OCCUR2(DATE, 0, 1) }
@@ -3181,14 +3344,19 @@ note_struc_link_sub : source_cit_sub
                     ;
 
 note_struc_emb_sect : OPEN DELIM TAG_NOTE opt_line_item
-                      { $<ctxt>$
+                      { char* str = $4;
+                       if (compat_mode(C_NOTE_TOO_LONG))
+                         str = compat_long_line_get_prefix($4);
+                       $<ctxt>$
                          = start_element(ELT_SUB_NOTE,
-                                         PARENT, $1, $3, $4,
-                                        GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
+                                         PARENT, $1, $3, str,
+                                       GEDCOM_MAKE_NULL_OR_STRING(val1, str));
                        reset_buffer(&concat_buffer);
                        if ($4)
                          safe_buf_append(&concat_buffer, $4);
-                       START(NOTE, $1, $<ctxt>$) 
+                       START(NOTE, $1, $<ctxt>$);
+                       if (compat_mode(C_NOTE_TOO_LONG))
+                         compat_long_line_finish($<ctxt>$, $1);
                       }
                       note_struc_emb_subs
                      { CHECK0 }
@@ -3565,22 +3733,41 @@ source_cit_emb_sub : continuation_sub
 
 /* SOURCE REPOSITORY CITATION */
 source_repos_cit_sub : source_repos_repo_sect  { OCCUR2(REPO, 0, 1) }
+                     | source_repos_repo_txt_sect
+                       { if (!compat_mode(C_NONSTD_SOUR_TAGS))
+                          INVALID_TAG("REPO");
+                        OCCUR2(REPO, 0, 1)
+                      }
                      ;
 
-source_repos_repo_sect : OPEN DELIM TAG_REPO mand_pointer
+/* Only for compatibility */
+source_repos_repo_txt_sect : OPEN DELIM TAG_REPO opt_line_item
+                 { if (compat_mode(C_NONSTD_SOUR_TAGS)) {
+                    $<ctxt>$ =
+                      compat_generate_nonstd_sour_start(PARENT, $1, $3, $4,
+                                                        &usertag_buffer);
+                  }
+                 }
+                 CLOSE            
+                 { if (compat_mode(C_NONSTD_SOUR_TAGS))
+                    compat_generate_nonstd_sour_end(PARENT, $<ctxt>5);
+                }
+               ;
+
+source_repos_repo_sect : OPEN DELIM TAG_REPO DELIM POINTER
                          { struct xref_value *xr
-                            = gedcom_parse_xref($4, XREF_USED, XREF_REPO);
-                          if (xr == NULL) HANDLE_ERROR;
+                            = gedcom_parse_xref($5, XREF_USED, XREF_REPO);
+                          if (xr == NULL) HANDLE_ERROR;
                           $<ctxt>$
                             = start_element(ELT_SUB_REPO,
-                                            PARENT, $1, $3, $4,
+                                            PARENT, $1, $3, $5,
                                             GEDCOM_MAKE_XREF_PTR(val1, xr));
-                          START(REPO, $1, $<ctxt>$) 
-                         }
+                          START(REPO, $1, $<ctxt>$);
+                        }
                          source_repos_repo_subs
                         { CHECK0 }
                          CLOSE 
-                         { end_element(ELT_SUB_REPO, PARENT, $<ctxt>5
+                         { end_element(ELT_SUB_REPO, PARENT, $<ctxt>6
                                       GEDCOM_MAKE_NULL(val1));
                         }
                        ;
@@ -3682,8 +3869,11 @@ no_std_rec  : user_rec /* 0:M */
 
 user_rec    : OPEN DELIM opt_xref USERTAG
               { if ($4.string[0] != '_') {
-                 if (compat_mode(C_551_TAGS)
-                     && compat_check_551_tag($4.string, &usertag_buffer)) {
+                 if ((compat_mode(C_551_TAGS)
+                      && compat_check_551_tag($4.string, &usertag_buffer))
+                     ||
+                     (compat_mode(C_NONSTD_SOUR_TAGS)
+                      && compat_check_sour_tag($4.string, &usertag_buffer))) {
                    $4.string = get_buf_string(&usertag_buffer);
                  }
                  else {                  
@@ -3712,13 +3902,15 @@ user_rec    : OPEN DELIM opt_xref USERTAG
             ;
 user_sect   : OPEN DELIM opt_xref USERTAG
               { if ($4.string[0] != '_') {
-                 if (compat_mode(C_551_TAGS)
-                     && compat_check_551_tag($4.string, &usertag_buffer)) {
-                   $4.string = get_buf_string(&usertag_buffer);
-                 }
-                 else if (compat_mode(C_SUBM_COMM) &&
-                          compat_check_subm_comm($4.string, get_parenttag(0),
-                                                 &usertag_buffer)) {
+                 if ((compat_mode(C_551_TAGS)
+                      && compat_check_551_tag($4.string, &usertag_buffer))
+                     ||
+                     (compat_mode(C_SUBM_COMM)
+                      && compat_check_subm_comm($4.string, get_parenttag(0),
+                                                &usertag_buffer))
+                     ||
+                     (compat_mode(C_NONSTD_SOUR_TAGS)
+                      && compat_check_sour_tag($4.string, &usertag_buffer))) {
                    $4.string = get_buf_string(&usertag_buffer);
                  }
                  else {
@@ -4161,9 +4353,3 @@ int gedcom_debug_print(const char* s, ...)
   }
   return(res);
 }
-
-/* Setting the error mechanism */
-void gedcom_set_error_handling(Gedcom_err_mech mechanism)
-{
-  error_mechanism = mechanism;
-}