#include "age.h"
#include "xref.h"
#include "compat.h"
+#include "buffer.h"
int count_level = 0;
int fail = 0;
Gedcom_err_mech error_mechanism = IMMED_FAIL;
Gedcom_val_struct val1;
Gedcom_val_struct val2;
-
-char line_item_buf[MAXGEDCLINELEN * UTF_FACTOR + 1];
-char *line_item_buf_ptr;
+void cleanup_line_item_buffer();
+struct safe_buffer line_item_buffer = { NULL, 0, NULL, 0,
+ cleanup_line_item_buffer };
+
+void cleanup_concat_buffer();
+struct safe_buffer concat_buffer = { NULL, 0, NULL, 0, cleanup_concat_buffer };
+
+void cleanup_usertag_buffer();
+struct safe_buffer usertag_buffer = { NULL, 0, NULL, 0,
+ cleanup_usertag_buffer};
+
/* These are defined at the bottom of the file */
void push_countarray(int level);
void set_parenttag(const char* tag);
void pop_countarray();
int count_tag(int tag);
int check_occurrence(int tag);
-void clean_up();
+void clean_up();
-#define CLEAR_BUFFER(BUF) \
- memset(BUF, 0, sizeof(BUF));
-
#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) { \
#TAG, parenttag); \
HANDLE_ERROR; \
} \
- }
+ }
+#define CHK_COND(TAG) \
+ check_occurrence(TAG_##TAG)
#define POP \
{ pop_countarray(); \
--count_level; \
}
%token_table
-%expect 308
+%expect 317
%token <string> BADTOKEN
%token <number> OPEN
NULL, GEDCOM_MAKE_NULL(val2));
START(HEAD, $1, $<ctxt>$) }
head_subs
- { if (compat_mode(C_FTREE)) {
- CHECK3(SOUR, GEDC, CHAR);
- compat_generate_submitter_link($<ctxt>4);
- }
- else if (compat_mode(C_LIFELINES)) {
- CHECK1(SOUR);
+ { if (compat_mode(C_NO_SUBMITTER) && ! CHK_COND(SUBM))
compat_generate_submitter_link($<ctxt>4);
+ else CHK(SUBM);
+
+ if (compat_mode(C_NO_GEDC) && ! CHK_COND(GEDC))
compat_generate_gedcom($<ctxt>4);
+ else CHK(GEDC);
+
+ if (compat_mode(C_NO_CHAR) && ! CHK_COND(CHAR)) {
if (compat_generate_char($<ctxt>4)) HANDLE_ERROR;
- }
- else
- CHECK4(SOUR, SUBM, GEDC, CHAR)
+ }
+ else CHK(CHAR);
+
+ CHECK1(SOUR);
}
CLOSE
- { end_record(REC_HEAD, $<ctxt>4);
- if (compat_mode(C_FTREE | C_LIFELINES))
+ { end_record(REC_HEAD, $<ctxt>4, GEDCOM_MAKE_NULL(val1));
+ if (compat_mode(C_NO_SUBMITTER))
compat_generate_submitter();
}
;
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))
+ | head_time_sect { if (!compat_mode(C_HEAD_TIME))
INVALID_TAG("TIME");
OCCUR2(TIME, 0, 1) }
| head_subm_sect { OCCUR2(SUBM, 1, 1) }
/* HEAD.SOUR */
head_sour_sect : OPEN DELIM TAG_SOUR mand_line_item
- { set_compatibility($4);
+ { set_compatibility_program($4);
$<ctxt>$ = start_element(ELT_HEAD_SOUR, PARENT,
$1, $3, $4,
GEDCOM_MAKE_STRING(val1, $4));
head_sour_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_HEAD_SOUR, PARENT, $<ctxt>5, NULL); }
+ { compute_compatibility();
+ end_element(ELT_HEAD_SOUR, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1)); }
;
head_sour_subs : /* empty */
;
head_sour_vers_sect : OPEN DELIM TAG_VERS mand_line_item
- { $<ctxt>$ = start_element(ELT_HEAD_SOUR_VERS, PARENT,
+ { set_compatibility_version($4);
+ $<ctxt>$ = start_element(ELT_HEAD_SOUR_VERS, PARENT,
$1, $3, $4,
GEDCOM_MAKE_STRING(val1, $4));
START(VERS, $1, $<ctxt>$)
{ CHECK0 }
CLOSE
{ end_element(ELT_HEAD_SOUR_VERS,
- PARENT, $<ctxt>5, NULL);
+ PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
}
;
head_sour_name_sect : OPEN DELIM TAG_NAME mand_line_item
{ CHECK0 }
CLOSE
{ end_element(ELT_HEAD_SOUR_NAME,
- PARENT, $<ctxt>5, NULL);
+ PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
}
;
head_sour_corp_sect : OPEN DELIM TAG_CORP mand_line_item
{ CHECK0 }
CLOSE
{ end_element(ELT_HEAD_SOUR_CORP,
- PARENT, $<ctxt>5, NULL);
+ PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_HEAD_SOUR_DATA,
- PARENT, $<ctxt>5, NULL);
+ PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_HEAD_SOUR_DATA_DATE,
- PARENT, $<ctxt>5, NULL);
+ PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
head_sour_data_copr_sect : OPEN DELIM TAG_COPR mand_line_item
{ CHECK0 }
CLOSE
{ end_element(ELT_HEAD_SOUR_DATA_COPR,
- PARENT, $<ctxt>5, NULL);
+ PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_HEAD_DEST,
- PARENT, $<ctxt>5, NULL);
+ PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
}
;
$<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
{ CHECK0 }
CLOSE
{ end_element(ELT_HEAD_DATE,
- PARENT, $<ctxt>5, NULL);
+ PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_HEAD_DATE_TIME,
- PARENT, $<ctxt>5, NULL);
+ PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
}
;
-/* HEAD.TIME (Only for 'Lifelines' 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 (Only for 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);
+ }
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_HEAD_SUBM,
- PARENT, $<ctxt>5, NULL);
+ PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
}
;
/* HEAD.SUBN */
{ CHECK0 }
CLOSE
{ end_element(ELT_HEAD_SUBN,
- PARENT, $<ctxt>5, NULL);
+ PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
}
;
/* HEAD.FILE */
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_HEAD_FILE, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_HEAD_FILE, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
/* HEAD.COPR */
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_HEAD_COPR, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_HEAD_COPR, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
/* HEAD.GEDC */
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, NULL);
+ { end_element(ELT_HEAD_GEDC, PARENT, $<ctxt>4,
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_HEAD_GEDC_VERS,
- PARENT, $<ctxt>5, NULL);
+ PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
}
;
head_gedc_form_sect : OPEN DELIM TAG_FORM mand_line_item
{ CHECK0 }
CLOSE
{ end_element(ELT_HEAD_GEDC_FORM,
- PARENT, $<ctxt>5, NULL);
+ PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
}
;
head_char_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_HEAD_CHAR, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_HEAD_CHAR, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_HEAD_CHAR_VERS,
- PARENT, $<ctxt>5, NULL);
+ PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
}
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_HEAD_LANG, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_HEAD_LANG, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
/* HEAD.PLAC */
head_plac_subs
{ CHECK1(FORM) }
CLOSE
- { end_element(ELT_HEAD_PLAC, PARENT, $<ctxt>4, NULL);
+ { end_element(ELT_HEAD_PLAC, PARENT, $<ctxt>4,
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_HEAD_PLAC_FORM,
- PARENT, $<ctxt>5, NULL);
+ PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
}
;
{ $<ctxt>$ = start_element(ELT_HEAD_NOTE,
PARENT, $1, $3, $4,
GEDCOM_MAKE_STRING(val1, $4));
+ reset_buffer(&concat_buffer);
+ safe_buf_append(&concat_buffer, $4);
START(NOTE, $1, $<ctxt>$)
}
head_note_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_HEAD_NOTE, PARENT, $<ctxt>5, NULL);
+ { char* complete = get_buf_string(&concat_buffer);
+ end_element(ELT_HEAD_NOTE, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_STRING(val1, complete));
}
;
fam_subs
{ CHECK0 }
CLOSE
- { end_record(REC_FAM, $<ctxt>6); }
+ { end_record(REC_FAM, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
;
fam_subs : /* empty */
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_FAM_HUSB, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_FAM_HUSB, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_FAM_WIFE, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_FAM_WIFE, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_FAM_CHIL, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_FAM_CHIL, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_FAM_NCHI, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_FAM_NCHI, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_FAM_SUBM, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_FAM_SUBM, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
indi_subs
{ CHECK0 }
CLOSE
- { end_record(REC_INDI, $<ctxt>6); }
+ { end_record(REC_INDI, $<ctxt>6, GEDCOM_MAKE_NULL(val1));
+ if (compat_mode(C_NO_SLGC_FAMC))
+ compat_generate_slgc_famc_fam();
+ }
;
indi_subs : /* empty */
| indi_afn_sect /* 0:M */
| ident_struc_sub /* 0:1 */
| change_date_sub /* 0:1 */
- | ftree_addr_sect { if (!compat_mode(C_FTREE))
+ | indi_addr_sect { if (!compat_mode(C_INDI_ADDR))
INVALID_TAG("ADDR");
}
| no_std_sub
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_INDI_RESN, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_INDI_RESN, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_INDI_SEX, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_INDI_SEX, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_INDI_SUBM, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_INDI_SUBM, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_INDI_ALIA, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_INDI_ALIA, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_INDI_ANCI, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_INDI_ANCI, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_INDI_DESI, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_INDI_DESI, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_INDI_RFN, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_INDI_RFN, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_INDI_AFN, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_INDI_AFN, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
-/* INDI.ADDR (Only for 'ftree' compatibility) */
-ftree_addr_sect : OPEN DELIM TAG_ADDR opt_line_item
- { if (compat_mode(C_FTREE)) {
+/* INDI.ADDR (Only for compatibility) */
+indi_addr_sect : OPEN DELIM TAG_ADDR opt_line_item
+ { if (compat_mode(C_INDI_ADDR)) {
Gedcom_ctxt par = compat_generate_resi_start(PARENT);
START(RESI, $1, par);
$<ctxt>$
= start_element(ELT_SUB_ADDR,
par, $1 + 1, $3, $4,
GEDCOM_MAKE_NULL_OR_STRING(val2, $4));
- START(ADDR, $1, $<ctxt>$);
+ reset_buffer(&concat_buffer);
+ safe_buf_append(&concat_buffer, $4);
+ START(ADDR, $1 + 1, $<ctxt>$);
}
else { START(ADDR, $1, NULL) }
}
ftree_addr_subs
{ CHECK0 }
CLOSE
- { if (compat_mode(C_FTREE)) {
+ { if (compat_mode(C_INDI_ADDR)) {
Gedcom_ctxt par = PARENT;
- end_element(ELT_SUB_ADDR, par, $<ctxt>5, NULL);
+ char* complete = get_buf_string(&concat_buffer);
+ end_element(ELT_SUB_ADDR, par, $<ctxt>5,
+ GEDCOM_MAKE_STRING(val1, complete));
CHECK0;
compat_generate_resi_end(PARENT, par);
}
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_PHON, GRANDPARENT(1),
- $<ctxt>5, NULL);
+ $<ctxt>5, GEDCOM_MAKE_NULL(val1));
}
;
obje_subs
{ CHECK2(FORM, BLOB) }
CLOSE
- { end_record(REC_OBJE, $<ctxt>6); }
+ { end_record(REC_OBJE, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
;
obje_subs : /* empty */
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_OBJE_FORM, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_OBJE_FORM, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_OBJE_TITL, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_OBJE_TITL, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
{ $<ctxt>$ = start_element(ELT_OBJE_BLOB,
PARENT, $1, $3, NULL,
GEDCOM_MAKE_NULL(val1));
+ reset_buffer(&concat_buffer);
START(BLOB, $1, $<ctxt>$)
}
obje_blob_subs
{ CHECK1(CONT) }
CLOSE
- { end_element(ELT_OBJE_BLOB, PARENT, $<ctxt>4, NULL);
+ { char* complete = get_buf_string(&concat_buffer);
+ end_element(ELT_OBJE_BLOB, PARENT, $<ctxt>4,
+ GEDCOM_MAKE_STRING(val1, complete));
}
;
{ $<ctxt>$ = start_element(ELT_OBJE_BLOB_CONT,
PARENT, $1, $3, $4,
GEDCOM_MAKE_STRING(val1, $4));
+ safe_buf_append(&concat_buffer, $4);
START(CONT, $1, $<ctxt>$)
}
no_std_subs
{ CHECK0 }
CLOSE
{ end_element(ELT_OBJE_BLOB_CONT, PARENT,
- $<ctxt>5, NULL);
+ $<ctxt>5, GEDCOM_MAKE_NULL(val1));
}
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_OBJE_OBJE, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_OBJE_OBJE, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
$<ctxt>$ = start_record(REC_NOTE,
$1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
$6, GEDCOM_MAKE_STRING(val2, $6));
+ reset_buffer(&concat_buffer);
+ safe_buf_append(&concat_buffer, $6);
START(NOTE, $1, $<ctxt>$) }
note_subs
{ CHECK0 }
CLOSE
- { end_record(REC_NOTE, $<ctxt>7); }
+ { char* complete = get_buf_string(&concat_buffer);
+ end_record(REC_NOTE, $<ctxt>7,
+ GEDCOM_MAKE_STRING(val1, complete)); }
;
note_line_item : /* empty */
- { if (!compat_mode(C_FTREE)) {
+ { if (!compat_mode(C_NOTE_NO_VALUE)) {
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 ****/
/*********************************************************************/
repo_subs
{ CHECK0 }
CLOSE
- { end_record(REC_REPO, $<ctxt>6); }
+ { end_record(REC_REPO, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
;
repo_subs : /* empty */
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_REPO_NAME, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_REPO_NAME, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
sour_subs
{ CHECK0 }
CLOSE
- { end_record(REC_SOUR, $<ctxt>6); }
+ { end_record(REC_SOUR, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
;
sour_subs : /* empty */
| 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 */
sour_data_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SOUR_DATA, PARENT, $<ctxt>4, NULL);
+ { end_element(ELT_SOUR_DATA, PARENT, $<ctxt>4,
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_SOUR_DATA_EVEN, PARENT,
- $<ctxt>5, NULL);
+ $<ctxt>5, GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_SOUR_DATA_EVEN_DATE, PARENT,
- $<ctxt>5, NULL);
+ $<ctxt>5, GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_SOUR_DATA_EVEN_PLAC, PARENT,
- $<ctxt>5, NULL);
+ $<ctxt>5, GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_SOUR_DATA_AGNC, PARENT,
- $<ctxt>5, NULL);
+ $<ctxt>5, GEDCOM_MAKE_NULL(val1));
}
;
{ $<ctxt>$ = start_element(ELT_SOUR_AUTH,
PARENT, $1, $3, $4,
GEDCOM_MAKE_STRING(val1, $4));
+ reset_buffer(&concat_buffer);
+ safe_buf_append(&concat_buffer, $4);
START(AUTH, $1, $<ctxt>$)
}
sour_auth_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SOUR_AUTH, PARENT, $<ctxt>5, NULL);
+ { char* complete = get_buf_string(&concat_buffer);
+ end_element(ELT_SOUR_AUTH, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_STRING(val1, complete));
}
;
{ $<ctxt>$ = start_element(ELT_SOUR_TITL,
PARENT, $1, $3, $4,
GEDCOM_MAKE_STRING(val1, $4));
+ reset_buffer(&concat_buffer);
+ safe_buf_append(&concat_buffer, $4);
START(TITL, $1, $<ctxt>$)
}
sour_titl_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SOUR_TITL, PARENT, $<ctxt>5, NULL);
+ { char* complete = get_buf_string(&concat_buffer);
+ end_element(ELT_SOUR_TITL, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_STRING(val1, complete));
}
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SOUR_ABBR, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SOUR_ABBR, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
{ $<ctxt>$ = start_element(ELT_SOUR_PUBL,
PARENT, $1, $3, $4,
GEDCOM_MAKE_STRING(val1, $4));
+ reset_buffer(&concat_buffer);
+ safe_buf_append(&concat_buffer, $4);
START(PUBL, $1, $<ctxt>$)
}
sour_publ_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SOUR_PUBL, PARENT, $<ctxt>5, NULL);
+ { char* complete = get_buf_string(&concat_buffer);
+ end_element(ELT_SOUR_PUBL, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_STRING(val1, complete));
}
;
{ $<ctxt>$ = start_element(ELT_SOUR_TEXT,
PARENT, $1, $3, $4,
GEDCOM_MAKE_STRING(val1, $4));
+ reset_buffer(&concat_buffer);
+ safe_buf_append(&concat_buffer, $4);
START(TEXT, $1, $<ctxt>$)
}
sour_text_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SOUR_TEXT, PARENT, $<ctxt>5, NULL);
+ { char* complete = get_buf_string(&concat_buffer);
+ end_element(ELT_SOUR_TEXT, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_STRING(val1, complete));
}
;
| 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 ****/
/*********************************************************************/
subn_subs
{ CHECK0 }
CLOSE
- { end_record(REC_SUBN, $<ctxt>6); }
+ { end_record(REC_SUBN, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
;
subn_subs : /* empty */
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUBN_SUBM, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUBN_SUBM, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUBN_FAMF, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUBN_FAMF, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUBN_TEMP, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUBN_TEMP, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUBN_ANCE, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUBN_ANCE, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUBN_DESC, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUBN_DESC, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUBN_ORDI, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUBN_ORDI, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUBN_RIN, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUBN_RIN, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
$<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); }
+ { 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
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUBM_NAME, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUBM_NAME, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUBM_LANG, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUBM_LANG, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUBM_RFN, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUBM_RFN, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUBM_RIN, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUBM_RIN, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
+/* 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 ****/
/*********************************************************************/
{ $<ctxt>$ = start_element(ELT_SUB_ADDR,
PARENT, $1, $3, $4,
GEDCOM_MAKE_STRING(val1, $4));
- START(ADDR, $1, $<ctxt>$)
+ reset_buffer(&concat_buffer);
+ safe_buf_append(&concat_buffer, $4);
+ START(ADDR, $1, $<ctxt>$);
+ if (compat_mode(C_SUBM_CTRY))
+ compat_save_ctry_parent_context($<ctxt>$);
}
addr_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_ADDR, PARENT, $<ctxt>5, NULL);
+ { char* complete = get_buf_string(&concat_buffer);
+ end_element(ELT_SUB_ADDR, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_STRING(val1, complete));
}
;
{ $<ctxt>$ = start_element(ELT_SUB_ADDR_CONT,
PARENT, $1, $3, $4,
GEDCOM_MAKE_STRING(val1, $4));
+ SAFE_BUF_ADDCHAR(&concat_buffer, '\n');
+ safe_buf_append(&concat_buffer, $4);
START(CONT, $1, $<ctxt>$)
}
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_ADDR_CONT, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUB_ADDR_CONT, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
addr_adr1_sect : OPEN DELIM TAG_ADR1 mand_line_item
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_ADDR_ADR1, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUB_ADDR_ADR1, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
addr_adr2_sect : OPEN DELIM TAG_ADR2 mand_line_item
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_ADDR_ADR2, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUB_ADDR_ADR2, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
addr_city_sect : OPEN DELIM TAG_CITY mand_line_item
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_ADDR_CITY, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUB_ADDR_CITY, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
addr_stae_sect : OPEN DELIM TAG_STAE mand_line_item
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_ADDR_STAE, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUB_ADDR_STAE, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
addr_post_sect : OPEN DELIM TAG_POST mand_line_item
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_ADDR_POST, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUB_ADDR_POST, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
addr_ctry_sect : OPEN DELIM TAG_CTRY mand_line_item
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_ADDR_CTRY, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUB_ADDR_CTRY, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_PHON, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUB_PHON, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
asso_subs
{ CHECK2(TYPE,RELA) }
CLOSE
- { end_element(ELT_SUB_ASSO, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUB_ASSO, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_ASSO_TYPE, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUB_ASSO_TYPE, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_ASSO_RELA, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUB_ASSO_RELA, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
change_date_chan_subs
{ CHECK1(DATE) }
CLOSE
- { end_element(ELT_SUB_CHAN, PARENT, $<ctxt>4, NULL);
+ { end_element(ELT_SUB_CHAN, PARENT, $<ctxt>4,
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_CHAN_DATE, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_CHAN_TIME, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
famc_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_FAMC, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUB_FAMC, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_FAMC_PEDI, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUB_FAMC_PEDI, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
| 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');
+ 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, NULL);
+ { end_element(ELT_SUB_CONT, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
{ $<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, NULL);
+ { end_element(ELT_SUB_CONC, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
+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) }
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_EVT_TYPE, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
event_detail_date_sect : OPEN DELIM TAG_DATE mand_line_item
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_EVT_DATE, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
event_detail_age_sect : OPEN DELIM TAG_AGE mand_line_item
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_EVT_AGE, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
event_detail_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_EVT_AGNC, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
event_detail_caus_sect : OPEN DELIM TAG_CAUS mand_line_item
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_EVT_CAUS, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
fam_event_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_FAM_EVT, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUB_FAM_EVT, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK1(AGE) }
CLOSE
{ end_element(ELT_SUB_FAM_EVT_HUSB, PARENT, $<ctxt>4,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_FAM_EVT_AGE, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK1(AGE) }
CLOSE
{ end_element(ELT_SUB_FAM_EVT_WIFE, PARENT, $<ctxt>4,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_FAM_EVT_EVEN, PARENT, $<ctxt>4,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_IDENT_REFN, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_IDENT_REFN_TYPE, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_IDENT_RIN, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
indiv_attr_event_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_INDIV_ATTR, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUB_INDIV_ATTR, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
indiv_attr_event_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_INDIV_RESI, PARENT, $<ctxt>4, NULL);
+ { end_element(ELT_SUB_INDIV_RESI, PARENT, $<ctxt>4,
+ GEDCOM_MAKE_NULL(val1));
}
;
indiv_birt_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_INDIV_BIRT, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUB_INDIV_BIRT, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_INDIV_BIRT_FAMC, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
indiv_gen_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_INDIV_GEN, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUB_INDIV_GEN, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
indiv_adop_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_INDIV_ADOP, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUB_INDIV_ADOP, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_INDIV_ADOP_FAMC, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
- PARENT, $<ctxt>5, NULL);
+ PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
indiv_gen_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_INDIV_EVEN, PARENT, $<ctxt>4, NULL);
+ { end_element(ELT_SUB_INDIV_EVEN, PARENT, $<ctxt>4,
+ GEDCOM_MAKE_NULL(val1));
}
;
lio_bapl_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_LIO_BAPL, PARENT, $<ctxt>4, NULL);
+ { end_element(ELT_SUB_LIO_BAPL, PARENT, $<ctxt>4,
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_LIO_BAPL_STAT, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
lio_bapl_date_sect : OPEN DELIM TAG_DATE mand_line_item
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_LIO_BAPL_DATE, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
lio_bapl_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_LIO_BAPL_TEMP, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
lio_bapl_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_LIO_BAPL_PLAC, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
START(SLGC, $1, $<ctxt>$)
}
lio_slgc_subs
- { CHECK1(FAMC) }
+ { if (compat_mode(C_NO_SLGC_FAMC) && ! CHK_COND(FAMC))
+ compat_generate_slgc_famc_link($<ctxt>4);
+ else CHK(FAMC);
+ CHECK0;
+ }
CLOSE
- { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4, NULL);
+ { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4,
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_LIO_SLGC_FAMC, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
lss_slgs_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4, NULL);
+ { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4,
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_LSS_SLGS_STAT, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
lss_slgs_date_sect : OPEN DELIM TAG_DATE mand_line_item
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_LSS_SLGS_DATE, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
lss_slgs_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_LSS_SLGS_TEMP, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
lss_slgs_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_LSS_SLGS_PLAC, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>6,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK2(FORM,FILE) }
CLOSE
{ end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>4,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_MULTIM_OBJE_FORM,
- PARENT, $<ctxt>5, NULL);
+ PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
multim_obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_MULTIM_OBJE_TITL,
- PARENT, $<ctxt>5, NULL);
+ PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
multim_obje_file_sect : OPEN DELIM TAG_FILE mand_line_item
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_MULTIM_OBJE_FILE,
- PARENT, $<ctxt>5, NULL);
+ PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
= start_element(ELT_SUB_NOTE,
PARENT, $1, $3, $5,
GEDCOM_MAKE_XREF_PTR(val1, xr));
- START(NOTE, $1, $<ctxt>$)
+ START(NOTE, $1, $<ctxt>$)
}
note_struc_link_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_NOTE, PARENT, $<ctxt>6, NULL);
+ { end_element(ELT_SUB_NOTE, PARENT, $<ctxt>6,
+ GEDCOM_MAKE_NULL(val1));
}
;
;
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));
- START(NOTE, $1, $<ctxt>$)
+ 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>$);
+ if (compat_mode(C_NOTE_TOO_LONG))
+ compat_long_line_finish($<ctxt>$, $1);
}
note_struc_emb_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_NOTE, PARENT, $<ctxt>5, NULL);
+ { char* complete = get_buf_string(&concat_buffer);
+ end_element(ELT_SUB_NOTE, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_STRING(val1, complete));
}
;
pers_name_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_PERS_NAME, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUB_PERS_NAME, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_PERS_NAME_NPFX, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
pers_name_givn_sect : OPEN DELIM TAG_GIVN mand_line_item
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_PERS_NAME_GIVN, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
pers_name_nick_sect : OPEN DELIM TAG_NICK mand_line_item
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_PERS_NAME_NICK, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
pers_name_spfx_sect : OPEN DELIM TAG_SPFX mand_line_item
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_PERS_NAME_SPFX, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
pers_name_surn_sect : OPEN DELIM TAG_SURN mand_line_item
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_PERS_NAME_SURN, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
pers_name_nsfx_sect : OPEN DELIM TAG_NSFX mand_line_item
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_PERS_NAME_NSFX, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
place_struc_plac_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_PLAC, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUB_PLAC, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_PLAC_FORM, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
source_cit_link_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_SOUR, PARENT, $<ctxt>6, NULL);
+ { end_element(ELT_SUB_SOUR, PARENT, $<ctxt>6,
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_SOUR_PAGE, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_SOUR_EVEN, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_SOUR_EVEN_ROLE,
- PARENT, $<ctxt>5, NULL);
+ PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_SOUR_DATA, PARENT, $<ctxt>4,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_SOUR_DATA_DATE,
- PARENT, $<ctxt>5, NULL);
+ PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
= start_element(ELT_SUB_SOUR_TEXT,
PARENT, $1, $3, $4,
GEDCOM_MAKE_STRING(val1, $4));
- START(TEXT, $1, $<ctxt>$)
+ reset_buffer(&concat_buffer);
+ safe_buf_append(&concat_buffer, $4);
+ START(TEXT, $1, $<ctxt>$)
}
source_cit_text_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_SOUR_TEXT, PARENT, $<ctxt>5,
- NULL);
+ { char* complete = get_buf_string(&concat_buffer);
+ end_element(ELT_SUB_SOUR_TEXT, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_STRING(val1, complete));
}
;
{ CHECK0 }
CLOSE
{ end_element(ELT_SUB_SOUR_QUAY, PARENT, $<ctxt>5,
- NULL);
+ GEDCOM_MAKE_NULL(val1));
}
;
{ $<ctxt>$ = start_element(ELT_SUB_SOUR,
PARENT, $1, $3, $4,
GEDCOM_MAKE_STRING(val1, $4));
+ reset_buffer(&concat_buffer);
+ safe_buf_append(&concat_buffer, $4);
START(SOUR, $1, $<ctxt>$)
}
source_cit_emb_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_SOUR, PARENT, $<ctxt>5, NULL);
+ { char* complete = get_buf_string(&concat_buffer);
+ end_element(ELT_SUB_SOUR, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_STRING(val1, complete));
}
;
/* 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, NULL);
+ { end_element(ELT_SUB_REPO, PARENT, $<ctxt>6,
+ GEDCOM_MAKE_NULL(val1));
}
;
caln_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_REPO_CALN, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUB_REPO_CALN, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
no_std_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_REPO_CALN_MEDI, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUB_REPO_CALN_MEDI, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
spou_fam_fams_subs
{ CHECK0 }
CLOSE
- { end_element(ELT_SUB_FAMS, PARENT, $<ctxt>5, NULL);
+ { end_element(ELT_SUB_FAMS, PARENT, $<ctxt>5,
+ GEDCOM_MAKE_NULL(val1));
}
;
user_rec : OPEN DELIM opt_xref USERTAG
{ if ($4.string[0] != '_') {
- gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
- $4);
- YYERROR;
+ 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 {
+ gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
+ $4);
+ YYERROR;
+ }
}
}
opt_value
user_sects
{ CHECK0 }
CLOSE
- { end_record(REC_USER, $<ctxt>7); }
+ { end_record(REC_USER, $<ctxt>7, GEDCOM_MAKE_NULL(val1)); }
;
user_sect : OPEN DELIM opt_xref USERTAG
{ if ($4.string[0] != '_') {
- gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
- $4);
- YYERROR;
+ 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 {
+ gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
+ $4);
+ YYERROR;
+ }
}
}
opt_value
user_sects
{ CHECK0 }
CLOSE
- { end_element(ELT_USER, PARENT, $<ctxt>7, NULL);
+ { end_element(ELT_USER, PARENT, $<ctxt>7,
+ GEDCOM_MAKE_NULL(val1));
+ if (compat_mode(C_SUBM_COMM))
+ compat_close_subm_comm();
}
;
user_sects : /* empty */ { }
| user_sects user_sect { }
+ | user_sects gen_sect
+ { if (compat_mode(C_SUBM_COMM)) {
+ }
+ else {
+ gedcom_error(_("Standard tag not allowed in user section"));
+ YYERROR;
+ }
+ }
;
opt_xref : /* empty */ { $$ = NULL; }
;
mand_line_item : /* empty */
- { if (compat_mode(C_LIFELINES)) {
- /* Lifelines tends to not care about mandatory values */
- gedcom_debug_print("==Val: ==");
- $$ = "";
+ { if (compat_mode(C_NO_REQUIRED_VALUES)) {
+ gedcom_debug_print("==Val: ==");
+ $$ = VALUE_IF_MISSING;
}
else {
gedcom_error(_("Missing value")); YYERROR;
;
line_item : anychar { size_t i;
- CLEAR_BUFFER(line_item_buf);
- line_item_buf_ptr = line_item_buf;
- /* The following also takes care of '@@' */
+ reset_buffer(&line_item_buffer);
+ /* The following also takes care of '@@' */
if (!strncmp($1, "@@", 3))
- *line_item_buf_ptr++ = '@';
+ SAFE_BUF_ADDCHAR(&line_item_buffer, '@')
else
for (i=0; i < strlen($1); i++)
- *line_item_buf_ptr++ = $1[i];
- $$ = line_item_buf;
+ SAFE_BUF_ADDCHAR(&line_item_buffer, $1[i])
+ $$ = get_buf_string(&line_item_buffer);
}
| ESCAPE { size_t i;
- CLEAR_BUFFER(line_item_buf);
- line_item_buf_ptr = line_item_buf;
- for (i=0; i < strlen($1); i++)
- *line_item_buf_ptr++ = $1[i];
- $$ = line_item_buf;
+ reset_buffer(&line_item_buffer);
+ for (i=0; i < strlen($1); i++)
+ SAFE_BUF_ADDCHAR(&line_item_buffer, $1[i])
+ $$ = get_buf_string(&line_item_buffer);
}
| line_item anychar
{ size_t i;
/* The following also takes care of '@@' */
if (!strncmp($2, "@@", 3))
- *line_item_buf_ptr++ = '@';
+ SAFE_BUF_ADDCHAR(&line_item_buffer, '@')
else
for (i=0; i < strlen($2); i++)
- *line_item_buf_ptr++ = $2[i];
- $$ = line_item_buf;
+ SAFE_BUF_ADDCHAR(&line_item_buffer, $2[i])
+ $$ = get_buf_string(&line_item_buffer);
}
| line_item ESCAPE
{ size_t i;
for (i=0; i < strlen($2); i++)
- *line_item_buf_ptr++ = $2[i];
- $$ = line_item_buf;
+ SAFE_BUF_ADDCHAR(&line_item_buffer, $2[i])
+ $$ = get_buf_string(&line_item_buffer);
}
| line_item error anychar { HANDLE_ERROR; }
| line_item error ESCAPE { HANDLE_ERROR; }
;
gen_sect : OPEN DELIM opt_xref anystdtag
- { INVALID_TAG($4.string); }
- opt_value opt_sects CLOSE
- { }
+ { if (compat_mode(C_SUBM_COMM)
+ && compat_check_subm_comm_cont($4.string)) {
+ /* Will pass here */
+ }
+ else {
+ INVALID_TAG($4.string);
+ }
+ }
+ opt_value
+ { if (compat_mode(C_SUBM_COMM)) {
+ $<ctxt>$ = compat_subm_comm_cont_start(PARENT, $6);
+ }
+ }
+ opt_sects CLOSE
+ { if (compat_mode(C_SUBM_COMM))
+ compat_subm_comm_cont_end(PARENT, $<ctxt>7);
+ }
;
gen_rec : gen_rec_top
void push_countarray(int level)
{
int *count = NULL;
- gedcom_debug_print("Push Count level: %d, level: %d\n", count_level, level);
+ gedcom_debug_print("Push Count level: %d, level: %d", count_level, level);
if (count_level != level + 1) {
gedcom_error(_("Internal error: count level mismatch"));
exit(1);
exit(1);
}
else {
- gedcom_debug_print("calloc countarray %d\n", count_level);
+ gedcom_debug_print("calloc countarray %d", count_level);
count = (int *)calloc(YYNTOKENS, sizeof(int));
if (count == NULL) {
gedcom_error(_("Internal error: count array calloc error"));
void pop_countarray()
{
int *count;
- gedcom_debug_print("Pop Count level: %d\n", count_level);
+ gedcom_debug_print("Pop Count level: %d", count_level);
if (count_level < 0) {
gedcom_error(_("Internal error: count array underflow"));
exit(1);
}
else {
count = count_arrays[count_level];
- gedcom_debug_print("free countarray %d\n", count_level);
+ gedcom_debug_print("free countarray %d", count_level);
free(count);
count_arrays[count_level] = NULL;
}
void clean_up()
{
- gedcom_debug_print("Cleanup countarrays\n");
+ gedcom_debug_print("Cleanup countarrays");
while (count_level > 0) {
pop_countarray();
--count_level;
}
}
+void cleanup_concat_buffer()
+{
+ cleanup_buffer(&concat_buffer);
+}
+
+void cleanup_line_item_buffer()
+{
+ cleanup_buffer(&line_item_buffer);
+}
+
+void cleanup_usertag_buffer()
+{
+ cleanup_buffer(&usertag_buffer);
+}
+
/* Enabling debug mode */
/* level 0: no debugging */
/* level 1: only internal */