void pop_countarray();
int count_tag(int tag);
int check_occurrence(int tag);
-void clean_up();
+void clean_up();
#define HANDLE_ERROR \
{ if (error_mechanism == IMMED_FAIL) { \
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) { \
}
%token_table
-%expect 308
+%expect 317
%token <string> BADTOKEN
%token <number> OPEN
$<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
;
/* 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);
+ }
}
;
START(GEDC, $1, $<ctxt>$)
}
head_gedc_subs
- { CHECK2(VERS, FORM) }
+ { if (compat_mode(C_NO_GEDC_FORM) && ! CHK_COND(FORM))
+ compat_generate_gedcom_form($<ctxt>4);
+ else CHK(FORM);
+
+ CHECK1(VERS)
+ }
+
CLOSE
{ end_element(ELT_HEAD_GEDC, PARENT, $<ctxt>4,
GEDCOM_MAKE_NULL(val1));
gedcom_error(_("Missing value")); YYERROR;
}
else {
- $$ = "-";
+ $$ = VALUE_IF_MISSING;
}
}
| DELIM line_item
| source_cit_sub /* 0:M */
| ident_struc_sub /* 0:1 */
| change_date_sub /* 0:1 */
+ | note_note_sect { if (!compat_mode(C_NOTE_NOTE))
+ INVALID_TAG("NOTE");
+ }
| no_std_sub
;
+/* Same actions as cont_sect, for compatibility */
+note_note_sect : OPEN DELIM TAG_NOTE opt_line_item
+ { $3.string = "CONT";
+ $3.value = TAG_CONT;
+ $<ctxt>$ = start_element(ELT_SUB_CONT,
+ PARENT, $1, $3, $4,
+ GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
+ SAFE_BUF_ADDCHAR(&concat_buffer, '\n');
+ if (GEDCOM_IS_STRING(&val1))
+ safe_buf_append(&concat_buffer, $4);
+ START(CONT, $1, $<ctxt>$)
+ }
+ no_std_subs
+ { CHECK0 }
+ CLOSE
+ { end_element(ELT_SUB_CONT, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
+ }
+ ;
+
/*********************************************************************/
/**** Repository record ****/
/*********************************************************************/
| 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 */
| 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 ****/
/*********************************************************************/
$<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 */
| 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
;
}
;
+/* 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 ****/
/*********************************************************************/
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 }
| conc_sect /* 0:M */
;
-cont_sect : OPEN DELIM TAG_CONT mand_line_item
+cont_sect : OPEN DELIM TAG_CONT opt_line_item
{ $<ctxt>$ = start_element(ELT_SUB_CONT,
PARENT, $1, $3, $4,
- GEDCOM_MAKE_STRING(val1, $4));
+ GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
SAFE_BUF_ADDCHAR(&concat_buffer, '\n');
- safe_buf_append(&concat_buffer, $4);
+ if (GEDCOM_IS_STRING(&val1))
+ 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,
{ $<ctxt>$ = start_element(ELT_SUB_CONC,
PARENT, $1, $3, $4,
GEDCOM_MAKE_STRING(val1, $4));
+ if (compat_mode(C_CONC_NEEDS_SPACE)) {
+ safe_buf_append(&concat_buffer, " ");
+ }
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,
}
;
+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) }
;
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 }
/* 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));
}
;
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 {
;
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 {
mand_line_item : /* empty */
{ if (compat_mode(C_NO_REQUIRED_VALUES)) {
gedcom_debug_print("==Val: ==");
- $$ = "-";
+ $$ = VALUE_IF_MISSING;
}
else {
gedcom_error(_("Missing value")); YYERROR;