From b05f7d8ed0b8dbd83e8cc8c0b36e276a5652887b Mon Sep 17 00:00:00 2001 From: Peter Verthez Date: Thu, 24 Jan 2002 17:22:27 +0000 Subject: [PATCH] Fix for ftree compatibility --- gedcom/gedcom.y | 39 ++++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 11 deletions(-) diff --git a/gedcom/gedcom.y b/gedcom/gedcom.y index 10486da..e4d8a70 100644 --- a/gedcom/gedcom.y +++ b/gedcom/gedcom.y @@ -168,9 +168,9 @@ enum _COMPAT { /* These are defined at the bottom of the file */ void push_countarray(); void set_parenttag(char* tag); -char* get_parenttag(); +char* get_parenttag(int offset); void set_parentctxt(Gedcom_ctxt ctxt); -Gedcom_ctxt get_parentctxt(); +Gedcom_ctxt get_parentctxt(int offset); void pop_countarray(); int count_tag(int tag); int check_occurrence(int tag); @@ -204,10 +204,12 @@ int compat_mode(int flags); START2(PARENTCTXT); \ } #define PARENT \ - get_parentctxt() + get_parentctxt(0) +#define GRANDPARENT(OFF) \ + get_parentctxt(OFF) #define CHK(TAG) \ { if (!check_occurrence(TAG_##TAG)) { \ - char* parenttag = get_parenttag(); \ + char* parenttag = get_parenttag(0); \ gedcom_error(_("The tag '%s' is mandatory within '%s', but missing"),\ #TAG, parenttag); \ HANDLE_ERROR; \ @@ -229,14 +231,14 @@ int compat_mode(int flags); #define OCCUR2(CHILDTAG, MIN, MAX) \ { int num = count_tag(TAG_##CHILDTAG); \ if (num > MAX) { \ - char* parenttag = get_parenttag(); \ + char* parenttag = get_parenttag(0); \ gedcom_error(_("The tag '%s' can maximally occur %d time(s) within '%s'"), \ #CHILDTAG, MAX, parenttag); \ HANDLE_ERROR; \ } \ } #define INVALID_TAG(CHILDTAG) \ - { char* parenttag = get_parenttag(); \ + { char* parenttag = get_parenttag(0); \ gedcom_error(_("The tag '%s' is not a valid tag within '%s'"), \ CHILDTAG, parenttag); \ HANDLE_ERROR; \ @@ -1199,10 +1201,25 @@ ftree_addr_subs : /* empty */ ; ftree_addr_sub : continuation_sub - | phon_sect + | ftree_addr_phon_sect | no_std_sub ; +ftree_addr_phon_sect : OPEN DELIM TAG_PHON mand_line_item + { $$ + = start_element(ELT_SUB_PHON, + GRANDPARENT(1), $1, $3, $4, + GEDCOM_MAKE_STRING(val1, $4)); + START(PHON, $$) + } + no_std_subs + { CHECK0 } + CLOSE + { end_element(ELT_SUB_PHON, GRANDPARENT(1), + $5, NULL); + } + ; + /*********************************************************************/ /**** Multimedia record ****/ /*********************************************************************/ @@ -3787,14 +3804,14 @@ void set_parentctxt(Gedcom_ctxt ctxt) ctxt_stack[count_level+1] = ctxt; } -char* get_parenttag() +char* get_parenttag(int offset) { - return tag_stack[count_level]; + return tag_stack[count_level - offset]; } -Gedcom_ctxt get_parentctxt() +Gedcom_ctxt get_parentctxt(int offset) { - return ctxt_stack[count_level]; + return ctxt_stack[count_level - offset]; } int count_tag(int tag) -- 2.30.2