X-Git-Url: https://git.dlugolecki.net.pl/?a=blobdiff_plain;f=gedcom%2Fgedcom.y;h=a0481851dd4aa3e0e1ba5a2737c6f88d402744f3;hb=adea338486cc9f38ad0a52cf3b185be1b5211e53;hp=eff626732a8920856544c1e445c45fd0283e195b;hpb=8c92a223c34fbd674f26520fb990c64a7b2f9147;p=gedcom-parse.git diff --git a/gedcom/gedcom.y b/gedcom/gedcom.y index eff6267..a048185 100644 --- a/gedcom/gedcom.y +++ b/gedcom/gedcom.y @@ -188,13 +188,19 @@ int compat_mode(int flags); yyerrok; \ } \ } -#define START(PARENTTAG,PARENTCTXT) \ - { ++count_level; \ - set_parenttag(#PARENTTAG); \ - set_parentctxt(PARENTCTXT); \ +#define START1(PARENTTAG) \ + { set_parenttag(#PARENTTAG); \ + } +#define START2(PARENTCTXT) \ + { set_parentctxt(PARENTCTXT); \ + ++count_level; \ push_countarray(); \ } -#define PARENT \ +#define START(PARENTTAG,PARENTCTXT) \ + { START1(PARENTTAG); \ + START2(PARENTCTXT); \ + } +#define PARENT \ get_parentctxt() #define CHK(TAG) \ { if (!check_occurrence(TAG_##TAG)) { \ @@ -431,7 +437,8 @@ record : fam_rec /**** Header ****/ /*********************************************************************/ head_sect : OPEN DELIM TAG_HEAD - { $$ = start_record(REC_HEAD, $1, GEDCOM_MAKE_NULL(), $3); + { $$ = start_record(REC_HEAD, $1, GEDCOM_MAKE_NULL(), $3, + NULL, GEDCOM_MAKE_NULL()); START(HEAD, $$) } head_subs { if (compat_mode(C_FTREE)) @@ -860,7 +867,8 @@ trlr_sect : OPEN DELIM TAG_TRLR CLOSE { } /*********************************************************************/ fam_rec : OPEN DELIM POINTER DELIM TAG_FAM { $$ = start_record(REC_FAM, - $1, GEDCOM_MAKE_STRING($3), $5); + $1, GEDCOM_MAKE_STRING($3), $5, + NULL, GEDCOM_MAKE_NULL()); START(FAM, $$) } fam_subs { CHECK0 } @@ -962,7 +970,8 @@ fam_subm_sect : OPEN DELIM TAG_SUBM mand_pointer /*********************************************************************/ indiv_rec : OPEN DELIM POINTER DELIM TAG_INDI { $$ = start_record(REC_INDI, - $1, GEDCOM_MAKE_STRING($3), $5); + $1, GEDCOM_MAKE_STRING($3), $5, + NULL, GEDCOM_MAKE_NULL()); START(INDI, $$) } indi_subs { CHECK0 } @@ -1121,7 +1130,8 @@ ftree_addr_sect : OPEN DELIM TAG_ADDR opt_line_item /*********************************************************************/ multim_rec : OPEN DELIM POINTER DELIM TAG_OBJE { $$ = start_record(REC_OBJE, - $1, GEDCOM_MAKE_STRING($3), $5); + $1, GEDCOM_MAKE_STRING($3), $5, + NULL, GEDCOM_MAKE_NULL()); START(OBJE, $$) } obje_subs { CHECK2(FORM, BLOB) } @@ -1226,12 +1236,13 @@ obje_obje_sect : OPEN DELIM TAG_OBJE mand_pointer /*********************************************************************/ note_rec : OPEN DELIM POINTER DELIM TAG_NOTE note_line_item { $$ = start_record(REC_NOTE, - $1, GEDCOM_MAKE_STRING($3), $5); + $1, GEDCOM_MAKE_STRING($3), $5, + $6, GEDCOM_MAKE_STRING($6)); START(NOTE, $$) } note_subs { CHECK0 } CLOSE - { end_record(REC_NOTE, $6); } + { end_record(REC_NOTE, $7); } ; note_line_item : /* empty */ @@ -1260,7 +1271,8 @@ note_sub : continuation_sub /* 0:M */ /*********************************************************************/ repos_rec : OPEN DELIM POINTER DELIM TAG_REPO { $$ = start_record(REC_REPO, - $1, GEDCOM_MAKE_STRING($3), $5); + $1, GEDCOM_MAKE_STRING($3), $5, + NULL, GEDCOM_MAKE_NULL()); START(REPO, $$) } repo_subs { CHECK0 } @@ -1299,7 +1311,8 @@ repo_name_sect : OPEN DELIM TAG_NAME mand_line_item /*********************************************************************/ source_rec : OPEN DELIM POINTER DELIM TAG_SOUR { $$ = start_record(REC_SOUR, - $1, GEDCOM_MAKE_STRING($3), $5); + $1, GEDCOM_MAKE_STRING($3), $5, + NULL, GEDCOM_MAKE_NULL()); START(SOUR, $$) } sour_subs { CHECK0 } @@ -1522,7 +1535,8 @@ sour_text_sub : continuation_sub /* 0:M */ /*********************************************************************/ submis_rec : OPEN DELIM POINTER DELIM TAG_SUBN { $$ = start_record(REC_SUBN, - $1, GEDCOM_MAKE_STRING($3), $5); + $1, GEDCOM_MAKE_STRING($3), $5, + NULL, GEDCOM_MAKE_NULL()); START(SUBN, $$) } subn_subs { CHECK0 } @@ -1647,7 +1661,8 @@ subn_rin_sect : OPEN DELIM TAG_RIN mand_line_item /*********************************************************************/ submit_rec : OPEN DELIM POINTER DELIM TAG_SUBM { $$ = start_record(REC_SUBM, - $1, GEDCOM_MAKE_STRING($3), $5); + $1, GEDCOM_MAKE_STRING($3), $5, + NULL, GEDCOM_MAKE_NULL()); START(SUBM, $$) } subm_subs { CHECK1(NAME) } @@ -2133,8 +2148,7 @@ fam_event_sect : OPEN DELIM fam_event_tag opt_value $$ = start_element(ELT_SUB_FAM_EVT, PARENT, $1, $3, $4, GEDCOM_MAKE_NULL_OR_STRING($4)); - /* set the parent context separately from START here */ - set_parentctxt($$); + START2($$); } fam_event_subs { CHECK0 } @@ -2143,16 +2157,16 @@ fam_event_sect : OPEN DELIM fam_event_tag opt_value } ; -fam_event_tag : TAG_ANUL { $$ = $1; START(ANUL, NULL) } - | TAG_CENS { $$ = $1; START(CENS, NULL) } - | TAG_DIV { $$ = $1; START(DIV, NULL) } - | TAG_DIVF { $$ = $1; START(DIVF, NULL) } - | TAG_ENGA { $$ = $1; START(ENGA, NULL) } - | TAG_MARR { $$ = $1; START(MARR, NULL) } - | TAG_MARB { $$ = $1; START(MARB, NULL) } - | TAG_MARC { $$ = $1; START(MARC, NULL) } - | TAG_MARL { $$ = $1; START(MARL, NULL) } - | TAG_MARS { $$ = $1; START(MARS, NULL) } +fam_event_tag : TAG_ANUL { $$ = $1; START1(ANUL) } + | TAG_CENS { $$ = $1; START1(CENS) } + | TAG_DIV { $$ = $1; START1(DIV) } + | TAG_DIVF { $$ = $1; START1(DIVF) } + | TAG_ENGA { $$ = $1; START1(ENGA) } + | TAG_MARR { $$ = $1; START1(MARR) } + | TAG_MARB { $$ = $1; START1(MARB) } + | TAG_MARC { $$ = $1; START1(MARC) } + | TAG_MARL { $$ = $1; START1(MARL) } + | TAG_MARS { $$ = $1; START1(MARS) } ; fam_event_subs : /* empty */ @@ -2303,8 +2317,7 @@ indiv_attr_sect : OPEN DELIM indiv_attr_tag mand_line_item { $$ = start_element(ELT_SUB_INDIV_ATTR, PARENT, $1, $3, $4, GEDCOM_MAKE_STRING($4)); - /* set the parent context separately from START here */ - set_parentctxt($$); + START2($$); } indiv_attr_event_subs { CHECK0 } @@ -2312,18 +2325,18 @@ indiv_attr_sect : OPEN DELIM indiv_attr_tag mand_line_item { end_element(ELT_SUB_INDIV_ATTR, PARENT, $5, NULL); } -indiv_attr_tag : TAG_CAST { $$ = $1; START(CAST, NULL) } - | TAG_DSCR { $$ = $1; START(DSCR, NULL) } - | TAG_EDUC { $$ = $1; START(EDUC, NULL) } - | TAG_IDNO { $$ = $1; START(IDNO, NULL) } - | TAG_NATI { $$ = $1; START(NATI, NULL) } - | TAG_NCHI { $$ = $1; START(NCHI, NULL) } - | TAG_NMR { $$ = $1; START(NMR, NULL) } - | TAG_OCCU { $$ = $1; START(OCCU, NULL) } - | TAG_PROP { $$ = $1; START(PROP, NULL) } - | TAG_RELI { $$ = $1; START(RELI, NULL) } - | TAG_SSN { $$ = $1; START(SSN, NULL) } - | TAG_TITL { $$ = $1; START(TITL, NULL) } +indiv_attr_tag : TAG_CAST { $$ = $1; START1(CAST) } + | TAG_DSCR { $$ = $1; START1(DSCR) } + | TAG_EDUC { $$ = $1; START1(EDUC) } + | TAG_IDNO { $$ = $1; START1(IDNO) } + | TAG_NATI { $$ = $1; START1(NATI) } + | TAG_NCHI { $$ = $1; START1(NCHI) } + | TAG_NMR { $$ = $1; START1(NMR) } + | TAG_OCCU { $$ = $1; START1(OCCU) } + | TAG_PROP { $$ = $1; START1(PROP) } + | TAG_RELI { $$ = $1; START1(RELI) } + | TAG_SSN { $$ = $1; START1(SSN) } + | TAG_TITL { $$ = $1; START1(TITL) } indiv_resi_sect : OPEN DELIM TAG_RESI { $$ = start_element(ELT_SUB_INDIV_RESI, @@ -2357,8 +2370,7 @@ indiv_birt_sect : OPEN DELIM indiv_birt_tag opt_value { $$ = start_element(ELT_SUB_INDIV_BIRT, PARENT, $1, $3, $4, GEDCOM_MAKE_NULL_OR_STRING($4)); - /* set the parent context separately from START here */ - set_parentctxt($$); + START2($$); } indiv_birt_subs { CHECK0 } @@ -2367,8 +2379,8 @@ indiv_birt_sect : OPEN DELIM indiv_birt_tag opt_value } ; -indiv_birt_tag : TAG_BIRT { $$ = $1; START(BIRT, NULL) } - | TAG_CHR { $$ = $1; START(CHR, NULL) } +indiv_birt_tag : TAG_BIRT { $$ = $1; START1(BIRT) } + | TAG_CHR { $$ = $1; START1(CHR) } ; indiv_birt_subs : /* empty */ @@ -2398,8 +2410,7 @@ indiv_gen_sect : OPEN DELIM indiv_gen_tag opt_value { $$ = start_element(ELT_SUB_INDIV_GEN, PARENT, $1, $3, $4, GEDCOM_MAKE_NULL_OR_STRING($4)); - /* set the parent context separately from START here */ - set_parentctxt($$); + START2($$); } indiv_gen_subs { CHECK0 } @@ -2408,25 +2419,25 @@ indiv_gen_sect : OPEN DELIM indiv_gen_tag opt_value } ; -indiv_gen_tag : TAG_DEAT { $$ = $1; START(DEAT, NULL) } - | TAG_BURI { $$ = $1; START(BURI, NULL) } - | TAG_CREM { $$ = $1; START(CREM, NULL) } - | TAG_BAPM { $$ = $1; START(BAPM, NULL) } - | TAG_BARM { $$ = $1; START(BARM, NULL) } - | TAG_BASM { $$ = $1; START(BASM, NULL) } - | TAG_BLES { $$ = $1; START(BLES, NULL) } - | TAG_CHRA { $$ = $1; START(CHRA, NULL) } - | TAG_CONF { $$ = $1; START(CONF, NULL) } - | TAG_FCOM { $$ = $1; START(FCOM, NULL) } - | TAG_ORDN { $$ = $1; START(ORDN, NULL) } - | TAG_NATU { $$ = $1; START(NATU, NULL) } - | TAG_EMIG { $$ = $1; START(EMIG, NULL) } - | TAG_IMMI { $$ = $1; START(IMMI, NULL) } - | TAG_CENS { $$ = $1; START(CENS, NULL) } - | TAG_PROB { $$ = $1; START(PROB, NULL) } - | TAG_WILL { $$ = $1; START(WILL, NULL) } - | TAG_GRAD { $$ = $1; START(GRAD, NULL) } - | TAG_RETI { $$ = $1; START(RETI, NULL) } +indiv_gen_tag : TAG_DEAT { $$ = $1; START1(DEAT) } + | TAG_BURI { $$ = $1; START1(BURI) } + | TAG_CREM { $$ = $1; START1(CREM) } + | TAG_BAPM { $$ = $1; START1(BAPM) } + | TAG_BARM { $$ = $1; START1(BARM) } + | TAG_BASM { $$ = $1; START1(BASM) } + | TAG_BLES { $$ = $1; START1(BLES) } + | TAG_CHRA { $$ = $1; START1(CHRA) } + | TAG_CONF { $$ = $1; START1(CONF) } + | TAG_FCOM { $$ = $1; START1(FCOM) } + | TAG_ORDN { $$ = $1; START1(ORDN) } + | TAG_NATU { $$ = $1; START1(NATU) } + | TAG_EMIG { $$ = $1; START1(EMIG) } + | TAG_IMMI { $$ = $1; START1(IMMI) } + | TAG_CENS { $$ = $1; START1(CENS) } + | TAG_PROB { $$ = $1; START1(PROB) } + | TAG_WILL { $$ = $1; START1(WILL) } + | TAG_GRAD { $$ = $1; START1(GRAD) } + | TAG_RETI { $$ = $1; START1(RETI) } ; indiv_gen_subs : /* empty */ @@ -2514,8 +2525,7 @@ lio_bapl_sect : OPEN DELIM lio_bapl_tag { $$ = start_element(ELT_SUB_LIO_BAPL, PARENT, $1, $3, NULL, GEDCOM_MAKE_NULL()); - /* set the parent context separately from START here */ - set_parentctxt($$); + START2($$); } lio_bapl_subs { CHECK0 } @@ -2524,9 +2534,9 @@ lio_bapl_sect : OPEN DELIM lio_bapl_tag } ; -lio_bapl_tag : TAG_BAPL { $$ = $1; START(BAPL, NULL) } - | TAG_CONL { $$ = $1; START(CONL, NULL) } - | TAG_ENDL { $$ = $1; START(ENDL, NULL) } +lio_bapl_tag : TAG_BAPL { $$ = $1; START1(BAPL) } + | TAG_CONL { $$ = $1; START1(CONL) } + | TAG_ENDL { $$ = $1; START1(ENDL) } ; lio_bapl_subs : /* empty */ @@ -3280,7 +3290,7 @@ no_std_rec : user_rec /* 0:M */ | error error_subs CLOSE { HANDLE_ERROR } ; -user_rec : OPEN DELIM opt_xref USERTAG +user_rec : OPEN DELIM opt_xref USERTAG { if ($4.string[0] != '_') { gedcom_error(_("Undefined tag (and not a valid user tag): %s"), $4); @@ -3289,7 +3299,8 @@ user_rec : OPEN DELIM opt_xref USERTAG } opt_value { $$ = start_record(REC_USER, - $1, GEDCOM_MAKE_NULL_OR_STRING($3), $4); + $1, GEDCOM_MAKE_NULL_OR_STRING($3), $4, + $6, GEDCOM_MAKE_NULL_OR_STRING($6)); START($4, $$) } user_sects @@ -3297,7 +3308,7 @@ user_rec : OPEN DELIM opt_xref USERTAG CLOSE { end_record(REC_USER, $7); } ; -user_sect : OPEN DELIM opt_xref USERTAG +user_sect : OPEN DELIM opt_xref USERTAG { if ($4.string[0] != '_') { gedcom_error(_("Undefined tag (and not a valid user tag): %s"), $4); @@ -3343,7 +3354,8 @@ mand_line_item : /* empty */ { gedcom_error(_("Missing value")); YYERROR; } ; opt_line_item : /* empty */ { } - | DELIM line_item { } + | DELIM line_item { gedcom_debug_print("==Val: %s==", $2); + $$ = $2; } ; line_item : anychar { size_t i; @@ -3589,12 +3601,12 @@ void push_countarray() void set_parenttag(char* tag) { - strncpy(tag_stack[count_level], tag, MAXSTDTAGLEN+1); + strncpy(tag_stack[count_level+1], tag, MAXSTDTAGLEN+1); } void set_parentctxt(Gedcom_ctxt ctxt) { - ctxt_stack[count_level] = ctxt; + ctxt_stack[count_level+1] = ctxt; } char* get_parenttag()