2 Copyright (C) 2001, 2002 The Genes Development Team
3 This file is part of the Gedcom parser library.
4 Contributed by Peter Verthez <Peter.Verthez@advalvas.be>, 2001.
6 The Gedcom parser library is free software; you can redistribute it
7 and/or modify it under the terms of the GNU Lesser General Public
8 License as published by the Free Software Foundation; either
9 version 2.1 of the License, or (at your option) any later version.
11 The Gedcom parser library is distributed in the hope that it will be
12 useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 Lesser General Public License for more details.
16 You should have received a copy of the GNU Lesser General Public
17 License along with the Gedcom parser library; if not, write to the
18 Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
24 /* WARNING: THIS PARSER RELIES HEAVILY ON SOME FEATURES OF BISON.
25 DON'T TRY TO USE IT WITH YACC, IT WON'T WORK...
28 /* Design of the parser:
30 In general, a GEDCOM file contains records, each consisting of a line
31 (which we'll call a section), hierarchically containing other lines
32 (subsections of the section).
34 This means that in general we have:
36 A 'record' is a 'section' (sect) containing 'subsections' (subs)
37 Each 'subsection' (sub) is again a specific 'section' (sect)
39 In parser notation, this means:
43 sect : <some prefix> subs <some suffix>
45 subs : <empty> | subs sub
47 sub : sect_a | sect_b | ...
49 This pattern is repeated throughout the parser for the different types of
53 Cardinality of the subsections:
54 -------------------------------
55 Note that in the above, the order of the subsections is of no importance.
56 Indeed, this is the case in the GEDCOM grammar. However, this also makes
57 it difficult to check whether there are not too many subsections of a
58 specific type, or whether a mandatory subsection is indeed there.
60 Suppose there is a section A that can contain 0 or 1 B section and
63 This can be expressed in parser notation as follows:
65 A : CC | BCC | CBC | CCB
67 So, cardinality is indeed expressable. However, as the number of subsection
68 types and the limits grow bigger (and even theoretically limitless), listing
69 all possible permutations becomes quickly unfeasible.
71 Much simpler is to say:
74 subs : <empty> | subs sub
77 and then check the cardinality in the semantic actions, which is the
78 solution chosen in the parser below, using the following macros:
81 Make a new context for the <parent> tag to count child tags in
83 - OCCUR2(<child>, <min>, <max>)
84 Express that the <child> tag should occur at least <min> times and
85 at most <max> tags within its parent
87 What this actually does is the following. It increments the counter
88 for that tag and then checks whether the maximum is exceeded. If so,
89 then a parser error is produced. The minimum is not actually checked
90 by this macro, but it makes the statements more declarative.
92 - OCCUR1(<child>, <min>)
93 Express that the <child> tag should occur at least <min> times within
94 its parent (no upper limit)
96 Actually, this only increments the counter for the tag, but it looks
97 very like the previous macro.
99 If the minimum is 0, it is not necessary to express this constraint.
101 - CHECKn(<child1>, ..., <childn>)
102 This closes the context for the parent tag and checks whether the
103 given <child> tags did effectively occur within the parent (i.e.
104 these are the tags that were mandatory).
106 Since the <min> values above are always 0 or 1 in GEDCOM, this is
107 sufficient. All sub-tags that declare a minimum of 1 in the OCCUR
108 macros should be listed in this macro here.
110 The macros CHECK0 to CHECK4 are defined like this (the first one
111 has no arguments and is only used to close the parent context; note
112 that this is necessary for correct functioning).
116 Only sections that have subsections need to use these macros. This can
117 be done like this (the OPEN and CHECK macros are used as mid-rule
118 actions around the subsections):
120 head_sect : OPEN DELIM TAG_HEAD
124 CLOSE { <semantic actions> }
130 head_sub : head_sour_sect { OCCUR2(SOUR, 1, 1) }
131 | head_dest_sect { OCCUR2(DEST, 0, 1) }
132 | head_date_sect { OCCUR2(DATE, 0, 1) }
138 - The syntax analysis doesn't handle the contents of the line values;
139 this is done in the semantic analysis.
144 #include "gedcom_internal.h"
145 #include "multilex.h"
146 #include "encoding.h"
147 #include "interface.h"
153 int compat_enabled = 1;
154 int gedcom_high_level_debug = 0;
155 int compatibility = 0;
156 Gedcom_err_mech error_mechanism = IMMED_FAIL;
157 Gedcom_val_struct val1;
158 Gedcom_val_struct val2;
160 char line_item_buf[MAXGEDCLINELEN * UTF_FACTOR + 1];
161 char *line_item_buf_ptr;
167 /* These are defined at the bottom of the file */
168 void push_countarray();
169 void set_parenttag(char* tag);
170 char* get_parenttag();
171 void set_parentctxt(Gedcom_ctxt ctxt);
172 Gedcom_ctxt get_parentctxt();
173 void pop_countarray();
174 int count_tag(int tag);
175 int check_occurrence(int tag);
176 void set_compatibility(char* program);
177 int compat_mode(int flags);
179 #define CLEAR_BUFFER(BUF) \
180 memset(BUF, 0, sizeof(BUF));
182 #define HANDLE_ERROR \
183 { if (error_mechanism == IMMED_FAIL) { \
186 else if (error_mechanism == DEFER_FAIL) { \
189 else if (error_mechanism == IGNORE_ERRORS) { \
193 #define START1(PARENTTAG) \
194 { set_parenttag(#PARENTTAG); \
196 #define START2(PARENTCTXT) \
197 { set_parentctxt(PARENTCTXT); \
201 #define START(PARENTTAG,PARENTCTXT) \
202 { START1(PARENTTAG); \
203 START2(PARENTCTXT); \
208 { if (!check_occurrence(TAG_##TAG)) { \
209 char* parenttag = get_parenttag(); \
210 gedcom_error(_("The tag '%s' is mandatory within '%s', but missing"),\
216 { pop_countarray(); \
220 #define CHECK1(TAG1) { CHK(TAG1); POP; }
221 #define CHECK2(TAG1,TAG2) \
222 { CHK(TAG1); CHK(TAG2); POP; }
223 #define CHECK3(TAG1,TAG2,TAG3) \
224 { CHK(TAG1); CHK(TAG2); CHK(TAG3); POP; }
225 #define CHECK4(TAG1,TAG2,TAG3,TAG4) \
226 { CHK(TAG1); CHK(TAG2); CHK(TAG3); CHK(TAG4); POP; }
227 #define OCCUR1(CHILDTAG, MIN) { count_tag(TAG_##CHILDTAG); }
228 #define OCCUR2(CHILDTAG, MIN, MAX) \
229 { int num = count_tag(TAG_##CHILDTAG); \
231 char* parenttag = get_parenttag(); \
232 gedcom_error(_("The tag '%s' can maximally occur %d time(s) within '%s'"), \
233 #CHILDTAG, MAX, parenttag); \
237 #define INVALID_TAG(CHILDTAG) \
238 { char* parenttag = get_parenttag(); \
239 gedcom_error(_("The tag '%s' is not a valid tag within '%s'"), \
240 CHILDTAG, parenttag); \
243 #define INVALID_TOP_TAG(CHILDTAG) \
244 { gedcom_error(_("The tag '%s' is not a valid top-level tag"), \
254 struct tag_struct tag;
261 %token <string> BADTOKEN
263 %token <string> CLOSE
264 %token <string> ESCAPE
265 %token <string> DELIM
266 %token <string> ANYCHAR
267 %token <string> POINTER
269 %token <tag> TAG_ABBR
270 %token <tag> TAG_ADDR
271 %token <tag> TAG_ADR1
272 %token <tag> TAG_ADR2
273 %token <tag> TAG_ADOP
276 %token <tag> TAG_AGNC
277 %token <tag> TAG_ALIA
278 %token <tag> TAG_ANCE
279 %token <tag> TAG_ANCI
280 %token <tag> TAG_ANUL
281 %token <tag> TAG_ASSO
282 %token <tag> TAG_AUTH
283 %token <tag> TAG_BAPL
284 %token <tag> TAG_BAPM
285 %token <tag> TAG_BARM
286 %token <tag> TAG_BASM
287 %token <tag> TAG_BIRT
288 %token <tag> TAG_BLES
289 %token <tag> TAG_BLOB
290 %token <tag> TAG_BURI
291 %token <tag> TAG_CALN
292 %token <tag> TAG_CAST
293 %token <tag> TAG_CAUS
294 %token <tag> TAG_CENS
295 %token <tag> TAG_CHAN
296 %token <tag> TAG_CHAR
297 %token <tag> TAG_CHIL
299 %token <tag> TAG_CHRA
300 %token <tag> TAG_CITY
301 %token <tag> TAG_CONC
302 %token <tag> TAG_CONF
303 %token <tag> TAG_CONL
304 %token <tag> TAG_CONT
305 %token <tag> TAG_COPR
306 %token <tag> TAG_CORP
307 %token <tag> TAG_CREM
308 %token <tag> TAG_CTRY
309 %token <tag> TAG_DATA
310 %token <tag> TAG_DATE
311 %token <tag> TAG_DEAT
312 %token <tag> TAG_DESC
313 %token <tag> TAG_DESI
314 %token <tag> TAG_DEST
316 %token <tag> TAG_DIVF
317 %token <tag> TAG_DSCR
318 %token <tag> TAG_EDUC
319 %token <tag> TAG_EMIG
320 %token <tag> TAG_ENDL
321 %token <tag> TAG_ENGA
322 %token <tag> TAG_EVEN
324 %token <tag> TAG_FAMC
325 %token <tag> TAG_FAMF
326 %token <tag> TAG_FAMS
327 %token <tag> TAG_FCOM
328 %token <tag> TAG_FILE
329 %token <tag> TAG_FORM
330 %token <tag> TAG_GEDC
331 %token <tag> TAG_GIVN
332 %token <tag> TAG_GRAD
333 %token <tag> TAG_HEAD
334 %token <tag> TAG_HUSB
335 %token <tag> TAG_IDNO
336 %token <tag> TAG_IMMI
337 %token <tag> TAG_INDI
338 %token <tag> TAG_LANG
339 %token <tag> TAG_LEGA
340 %token <tag> TAG_MARB
341 %token <tag> TAG_MARC
342 %token <tag> TAG_MARL
343 %token <tag> TAG_MARR
344 %token <tag> TAG_MARS
345 %token <tag> TAG_MEDI
346 %token <tag> TAG_NAME
347 %token <tag> TAG_NATI
348 %token <tag> TAG_NATU
349 %token <tag> TAG_NCHI
350 %token <tag> TAG_NICK
352 %token <tag> TAG_NOTE
353 %token <tag> TAG_NPFX
354 %token <tag> TAG_NSFX
355 %token <tag> TAG_OBJE
356 %token <tag> TAG_OCCU
357 %token <tag> TAG_ORDI
358 %token <tag> TAG_ORDN
359 %token <tag> TAG_PAGE
360 %token <tag> TAG_PEDI
361 %token <tag> TAG_PHON
362 %token <tag> TAG_PLAC
363 %token <tag> TAG_POST
364 %token <tag> TAG_PROB
365 %token <tag> TAG_PROP
366 %token <tag> TAG_PUBL
367 %token <tag> TAG_QUAY
368 %token <tag> TAG_REFN
369 %token <tag> TAG_RELA
370 %token <tag> TAG_RELI
371 %token <tag> TAG_REPO
372 %token <tag> TAG_RESI
373 %token <tag> TAG_RESN
374 %token <tag> TAG_RETI
377 %token <tag> TAG_ROLE
379 %token <tag> TAG_SLGC
380 %token <tag> TAG_SLGS
381 %token <tag> TAG_SOUR
382 %token <tag> TAG_SPFX
384 %token <tag> TAG_STAE
385 %token <tag> TAG_STAT
386 %token <tag> TAG_SUBM
387 %token <tag> TAG_SUBN
388 %token <tag> TAG_SURN
389 %token <tag> TAG_TEMP
390 %token <tag> TAG_TEXT
391 %token <tag> TAG_TIME
392 %token <tag> TAG_TITL
393 %token <tag> TAG_TRLR
394 %token <tag> TAG_TYPE
395 %token <tag> TAG_VERS
396 %token <tag> TAG_WIFE
397 %token <tag> TAG_WILL
399 %type <tag> anystdtag
400 %type <tag> anytoptag
401 %type <tag> fam_event_tag
402 %type <tag> indiv_attr_tag
403 %type <tag> indiv_birt_tag
404 %type <tag> indiv_gen_tag
405 %type <tag> lio_bapl_tag
406 %type <string> line_item
407 %type <string> mand_line_item
408 %type <string> mand_pointer
409 %type <string> note_line_item
410 %type <string> anychar
411 %type <string> opt_xref
412 %type <string> opt_value
413 %type <string> opt_line_item
414 %type <ctxt> head_sect
418 file : head_sect records trlr_sect
419 { if (fail == 1) YYABORT; }
422 records : /* empty */
437 /*********************************************************************/
439 /*********************************************************************/
440 head_sect : OPEN DELIM TAG_HEAD
441 { $<ctxt>$ = start_record(REC_HEAD, $1, GEDCOM_MAKE_NULL(val1),
443 NULL, GEDCOM_MAKE_NULL(val2));
444 START(HEAD, $<ctxt>$) }
446 { if (compat_mode(C_FTREE))
447 CHECK3(SOUR, GEDC, CHAR)
449 CHECK4(SOUR, SUBM, GEDC, CHAR)
452 { end_record(REC_HEAD, $<ctxt>4); }
455 head_subs : /* empty */
459 head_sub : head_sour_sect { OCCUR2(SOUR, 1, 1) }
460 | head_dest_sect { OCCUR2(DEST, 0, 1) }
461 | head_date_sect { OCCUR2(DATE, 0, 1) }
462 | head_subm_sect { OCCUR2(SUBM, 1, 1) }
463 | head_subn_sect { OCCUR2(SUBN, 0, 1) }
464 | head_file_sect { OCCUR2(FILE, 0, 1) }
465 | head_copr_sect { OCCUR2(COPR, 0, 1) }
466 | head_gedc_sect { OCCUR2(GEDC, 1, 1) }
467 | head_char_sect { OCCUR2(CHAR, 1, 1) }
468 | head_lang_sect { OCCUR2(LANG, 0, 1) }
469 | head_plac_sect { OCCUR2(PLAC, 0, 1) }
470 | head_note_sect { OCCUR2(NOTE, 0, 1) }
475 head_sour_sect : OPEN DELIM TAG_SOUR mand_line_item
476 { set_compatibility($4);
477 $<ctxt>$ = start_element(ELT_HEAD_SOUR, PARENT,
479 GEDCOM_MAKE_STRING(val1, $4));
480 START(SOUR, $<ctxt>$)
485 { end_element(ELT_HEAD_SOUR, PARENT, $<ctxt>5, NULL); }
488 head_sour_subs : /* empty */
489 | head_sour_subs head_sour_sub
492 head_sour_sub : head_sour_vers_sect { OCCUR2(VERS, 0, 1) }
493 | head_sour_name_sect { OCCUR2(NAME, 0, 1) }
494 | head_sour_corp_sect { OCCUR2(CORP, 0, 1) }
495 | head_sour_data_sect { OCCUR2(DATA, 0, 1) }
499 head_sour_vers_sect : OPEN DELIM TAG_VERS mand_line_item
500 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_VERS, PARENT,
502 GEDCOM_MAKE_STRING(val1, $4));
503 START(VERS, $<ctxt>$)
508 { end_element(ELT_HEAD_SOUR_VERS,
509 PARENT, $<ctxt>5, NULL);
512 head_sour_name_sect : OPEN DELIM TAG_NAME mand_line_item
513 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_NAME, PARENT,
515 GEDCOM_MAKE_STRING(val1, $4));
516 START(NAME, $<ctxt>$)
521 { end_element(ELT_HEAD_SOUR_NAME,
522 PARENT, $<ctxt>5, NULL);
525 head_sour_corp_sect : OPEN DELIM TAG_CORP mand_line_item
526 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_CORP, PARENT,
528 GEDCOM_MAKE_STRING(val1, $4));
529 START(CORP, $<ctxt>$)
534 { end_element(ELT_HEAD_SOUR_CORP,
535 PARENT, $<ctxt>5, NULL);
539 head_sour_corp_subs : /* empty */
540 | head_sour_corp_subs head_sour_corp_sub
543 head_sour_corp_sub : addr_struc_sub /* 0:1 */
547 head_sour_data_sect : OPEN DELIM TAG_DATA mand_line_item
548 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_DATA, PARENT,
550 GEDCOM_MAKE_STRING(val1, $4));
551 START(DATA, $<ctxt>$)
556 { end_element(ELT_HEAD_SOUR_DATA,
557 PARENT, $<ctxt>5, NULL);
561 head_sour_data_subs : /* empty */
562 | head_sour_data_subs head_sour_data_sub
565 head_sour_data_sub : head_sour_data_date_sect { OCCUR2(DATE, 0, 1) }
566 | head_sour_data_copr_sect { OCCUR2(COPR, 0, 1) }
570 head_sour_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
571 { struct date_value dv = gedcom_parse_date($4);
573 = start_element(ELT_HEAD_SOUR_DATA_DATE,
575 GEDCOM_MAKE_DATE(val1, dv));
576 START(DATE, $<ctxt>$)
581 { end_element(ELT_HEAD_SOUR_DATA_DATE,
582 PARENT, $<ctxt>5, NULL);
585 head_sour_data_copr_sect : OPEN DELIM TAG_COPR mand_line_item
587 = start_element(ELT_HEAD_SOUR_DATA_COPR,
589 GEDCOM_MAKE_STRING(val1, $4));
590 START(COPR, $<ctxt>$)
595 { end_element(ELT_HEAD_SOUR_DATA_COPR,
596 PARENT, $<ctxt>5, NULL);
601 head_dest_sect : OPEN DELIM TAG_DEST mand_line_item
602 { $<ctxt>$ = start_element(ELT_HEAD_DEST,
604 GEDCOM_MAKE_STRING(val1, $4));
605 START(DEST, $<ctxt>$)
610 { end_element(ELT_HEAD_DEST,
611 PARENT, $<ctxt>5, NULL);
616 head_date_sect : OPEN DELIM TAG_DATE mand_line_item
617 { struct date_value dv = gedcom_parse_date($4);
618 $<ctxt>$ = start_element(ELT_HEAD_DATE,
620 GEDCOM_MAKE_DATE(val1, dv));
621 START(DATE, $<ctxt>$)
626 { end_element(ELT_HEAD_DATE,
627 PARENT, $<ctxt>5, NULL);
631 head_date_subs : /* empty */
632 | head_date_subs head_date_sub
635 head_date_sub : head_date_time_sect { OCCUR2(TIME, 0, 1) }
639 head_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
640 { $<ctxt>$ = start_element(ELT_HEAD_DATE_TIME,
642 GEDCOM_MAKE_STRING(val1, $4));
643 START(TIME, $<ctxt>$)
648 { end_element(ELT_HEAD_DATE_TIME,
649 PARENT, $<ctxt>5, NULL);
654 head_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
655 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
657 if (xr == NULL) HANDLE_ERROR;
658 $<ctxt>$ = start_element(ELT_HEAD_SUBM,
660 GEDCOM_MAKE_XREF_PTR(val1, xr));
661 START(SUBM, $<ctxt>$)
666 { end_element(ELT_HEAD_SUBM,
667 PARENT, $<ctxt>5, NULL);
671 head_subn_sect : OPEN DELIM TAG_SUBN mand_pointer
672 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
674 if (xr == NULL) HANDLE_ERROR;
675 $<ctxt>$ = start_element(ELT_HEAD_SUBN,
677 GEDCOM_MAKE_XREF_PTR(val1, xr));
678 START(SUBN, $<ctxt>$)
683 { end_element(ELT_HEAD_SUBN,
684 PARENT, $<ctxt>5, NULL);
688 head_file_sect : OPEN DELIM TAG_FILE mand_line_item
689 { $<ctxt>$ = start_element(ELT_HEAD_FILE,
691 GEDCOM_MAKE_STRING(val1, $4));
692 START(FILE, $<ctxt>$)
697 { end_element(ELT_HEAD_FILE, PARENT, $<ctxt>5, NULL);
701 head_copr_sect : OPEN DELIM TAG_COPR mand_line_item
702 { $<ctxt>$ = start_element(ELT_HEAD_COPR,
704 GEDCOM_MAKE_STRING(val1, $4));
705 START(COPR, $<ctxt>$)
710 { end_element(ELT_HEAD_COPR, PARENT, $<ctxt>5, NULL);
714 head_gedc_sect : OPEN DELIM TAG_GEDC
715 { $<ctxt>$ = start_element(ELT_HEAD_GEDC,
716 PARENT, $1, $3, NULL,
717 GEDCOM_MAKE_NULL(val1));
718 START(GEDC, $<ctxt>$)
721 { CHECK2(VERS, FORM) }
723 { end_element(ELT_HEAD_GEDC, PARENT, $<ctxt>4, NULL);
727 head_gedc_subs : /* empty */
728 | head_gedc_subs head_gedc_sub
731 head_gedc_sub : head_gedc_vers_sect { OCCUR2(VERS, 1, 1) }
732 | head_gedc_form_sect { OCCUR2(FORM, 1, 1) }
735 head_gedc_vers_sect : OPEN DELIM TAG_VERS mand_line_item
736 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_VERS,
738 GEDCOM_MAKE_STRING(val1, $4));
739 START(VERS, $<ctxt>$)
744 { end_element(ELT_HEAD_GEDC_VERS,
745 PARENT, $<ctxt>5, NULL);
748 head_gedc_form_sect : OPEN DELIM TAG_FORM mand_line_item
749 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_FORM,
751 GEDCOM_MAKE_STRING(val1, $4));
752 START(FORM, $<ctxt>$)
757 { end_element(ELT_HEAD_GEDC_FORM,
758 PARENT, $<ctxt>5, NULL);
763 head_char_sect : OPEN DELIM TAG_CHAR mand_line_item
764 { if (open_conv_to_internal($4) == 0) YYERROR;
765 $<ctxt>$ = start_element(ELT_HEAD_CHAR,
767 GEDCOM_MAKE_STRING(val1, $4));
768 START(CHAR, $<ctxt>$)
773 { end_element(ELT_HEAD_CHAR, PARENT, $<ctxt>5, NULL);
777 head_char_subs : /* empty */
778 | head_char_subs head_char_sub
781 head_char_sub : head_char_vers_sect { OCCUR2(VERS, 0, 1) }
784 head_char_vers_sect : OPEN DELIM TAG_VERS mand_line_item
785 { $<ctxt>$ = start_element(ELT_HEAD_CHAR_VERS,
787 GEDCOM_MAKE_STRING(val1, $4));
788 START(VERS, $<ctxt>$)
793 { end_element(ELT_HEAD_CHAR_VERS,
794 PARENT, $<ctxt>5, NULL);
799 head_lang_sect : OPEN DELIM TAG_LANG mand_line_item
800 { $<ctxt>$ = start_element(ELT_HEAD_LANG,
802 GEDCOM_MAKE_STRING(val1, $4));
803 START(LANG, $<ctxt>$)
808 { end_element(ELT_HEAD_LANG, PARENT, $<ctxt>5, NULL);
812 head_plac_sect : OPEN DELIM TAG_PLAC
813 { $<ctxt>$ = start_element(ELT_HEAD_PLAC,
814 PARENT, $1, $3, NULL,
815 GEDCOM_MAKE_NULL(val1));
816 START(PLAC, $<ctxt>$)
821 { end_element(ELT_HEAD_PLAC, PARENT, $<ctxt>4, NULL);
825 head_plac_subs : /* empty */
826 | head_plac_subs head_plac_sub
829 head_plac_sub : head_plac_form_sect { OCCUR2(FORM, 1, 1) }
832 head_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
833 { $<ctxt>$ = start_element(ELT_HEAD_PLAC_FORM,
835 GEDCOM_MAKE_STRING(val1, $4));
836 START(FORM, $<ctxt>$)
841 { end_element(ELT_HEAD_PLAC_FORM,
842 PARENT, $<ctxt>5, NULL);
847 head_note_sect : OPEN DELIM TAG_NOTE mand_line_item
848 { $<ctxt>$ = start_element(ELT_HEAD_NOTE,
850 GEDCOM_MAKE_STRING(val1, $4));
851 START(NOTE, $<ctxt>$)
856 { end_element(ELT_HEAD_NOTE, PARENT, $<ctxt>5, NULL);
860 head_note_subs : /* empty */
861 | head_note_subs head_note_sub
864 head_note_sub : continuation_sub /* 0:M */
868 /*********************************************************************/
870 /*********************************************************************/
871 /* Don't need callbacks here, there is no information... */
872 trlr_sect : OPEN DELIM TAG_TRLR CLOSE { }
875 /*********************************************************************/
876 /**** Family record ****/
877 /*********************************************************************/
878 fam_rec : OPEN DELIM POINTER DELIM TAG_FAM
879 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
881 if (xr == NULL) HANDLE_ERROR;
882 $<ctxt>$ = start_record(REC_FAM,
883 $1, GEDCOM_MAKE_XREF_PTR(val1, xr),
885 NULL, GEDCOM_MAKE_NULL(val2));
886 START(FAM, $<ctxt>$) }
890 { end_record(REC_FAM, $<ctxt>6); }
893 fam_subs : /* empty */
897 fam_sub : fam_event_struc_sub /* 0:M */
898 | fam_husb_sect { OCCUR2(HUSB, 0, 1) }
899 | fam_wife_sect { OCCUR2(WIFE, 0, 1) }
900 | fam_chil_sect /* 0:M */
901 | fam_nchi_sect { OCCUR2(NCHI, 0, 1) }
902 | fam_subm_sect /* 0:M */
903 | lds_spouse_seal_sub /* 0:M */
904 | source_cit_sub /* 0:M */
905 | multim_link_sub /* 0:M */
906 | note_struc_sub /* 0:M */
907 | ident_struc_sub /* 0:1 */
908 | change_date_sub /* 0:1 */
913 fam_husb_sect : OPEN DELIM TAG_HUSB mand_pointer
914 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
916 if (xr == NULL) HANDLE_ERROR;
917 $<ctxt>$ = start_element(ELT_FAM_HUSB,
919 GEDCOM_MAKE_XREF_PTR(val1, xr));
920 START(HUSB, $<ctxt>$)
925 { end_element(ELT_FAM_HUSB, PARENT, $<ctxt>5, NULL);
930 fam_wife_sect : OPEN DELIM TAG_WIFE mand_pointer
931 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
933 if (xr == NULL) HANDLE_ERROR;
934 $<ctxt>$ = start_element(ELT_FAM_WIFE,
936 GEDCOM_MAKE_XREF_PTR(val1, xr));
937 START(WIFE, $<ctxt>$)
942 { end_element(ELT_FAM_WIFE, PARENT, $<ctxt>5, NULL);
947 fam_chil_sect : OPEN DELIM TAG_CHIL mand_pointer
948 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
950 if (xr == NULL) HANDLE_ERROR;
951 $<ctxt>$ = start_element(ELT_FAM_CHIL,
953 GEDCOM_MAKE_XREF_PTR(val1, xr));
954 START(CHIL, $<ctxt>$)
959 { end_element(ELT_FAM_CHIL, PARENT, $<ctxt>5, NULL);
964 fam_nchi_sect : OPEN DELIM TAG_NCHI mand_line_item
965 { $<ctxt>$ = start_element(ELT_FAM_NCHI,
967 GEDCOM_MAKE_STRING(val1, $4));
968 START(NCHI, $<ctxt>$)
973 { end_element(ELT_FAM_NCHI, PARENT, $<ctxt>5, NULL);
978 fam_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
979 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
981 if (xr == NULL) HANDLE_ERROR;
982 $<ctxt>$ = start_element(ELT_FAM_SUBM,
984 GEDCOM_MAKE_XREF_PTR(val1, xr));
985 START(SUBM, $<ctxt>$)
990 { end_element(ELT_FAM_SUBM, PARENT, $<ctxt>5, NULL);
994 /*********************************************************************/
995 /**** Individual record ****/
996 /*********************************************************************/
997 indiv_rec : OPEN DELIM POINTER DELIM TAG_INDI
998 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1000 if (xr == NULL) HANDLE_ERROR;
1001 $<ctxt>$ = start_record(REC_INDI,
1002 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1003 NULL, GEDCOM_MAKE_NULL(val2));
1004 START(INDI, $<ctxt>$) }
1008 { end_record(REC_INDI, $<ctxt>6); }
1011 indi_subs : /* empty */
1012 | indi_subs indi_sub
1015 indi_sub : indi_resn_sect { OCCUR2(RESN, 0, 1) }
1016 | pers_name_struc_sub /* 0:M */
1017 | indi_sex_sect { OCCUR2(SEX, 0, 1) }
1018 | indiv_even_struc_sub /* 0:M */
1019 | indiv_attr_struc_sub /* 0:M */
1020 | lds_indiv_ord_sub /* 0:M */
1021 | chi_fam_link_sub /* 0:M */
1022 | spou_fam_link_sub /* 0:M */
1023 | indi_subm_sect /* 0:M */
1024 | assoc_struc_sub /* 0:M */
1025 | indi_alia_sect /* 0:M */
1026 | indi_anci_sect /* 0:M */
1027 | indi_desi_sect /* 0:M */
1028 | source_cit_sub /* 0:M */
1029 | multim_link_sub /* 0:M */
1030 | note_struc_sub /* 0:M */
1031 | indi_rfn_sect { OCCUR2(RFN, 0, 1) }
1032 | indi_afn_sect /* 0:M */
1033 | ident_struc_sub /* 0:1 */
1034 | change_date_sub /* 0:1 */
1035 | ftree_addr_sect { if (!compat_mode(C_FTREE))
1036 INVALID_TAG("ADDR");
1042 indi_resn_sect : OPEN DELIM TAG_RESN mand_line_item
1043 { $<ctxt>$ = start_element(ELT_INDI_RESN,
1045 GEDCOM_MAKE_STRING(val1, $4));
1046 START(RESN, $<ctxt>$)
1051 { end_element(ELT_INDI_RESN, PARENT, $<ctxt>5, NULL);
1056 indi_sex_sect : OPEN DELIM TAG_SEX mand_line_item
1057 { $<ctxt>$ = start_element(ELT_INDI_SEX,
1059 GEDCOM_MAKE_STRING(val1, $4));
1060 START(SEX, $<ctxt>$)
1065 { end_element(ELT_INDI_SEX, PARENT, $<ctxt>5, NULL);
1070 indi_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1071 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1073 if (xr == NULL) HANDLE_ERROR;
1074 $<ctxt>$ = start_element(ELT_INDI_SUBM,
1076 GEDCOM_MAKE_XREF_PTR(val1, xr));
1077 START(SUBM, $<ctxt>$)
1082 { end_element(ELT_INDI_SUBM, PARENT, $<ctxt>5, NULL);
1087 indi_alia_sect : OPEN DELIM TAG_ALIA mand_pointer
1088 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1090 if (xr == NULL) HANDLE_ERROR;
1091 $<ctxt>$ = start_element(ELT_INDI_ALIA,
1093 GEDCOM_MAKE_XREF_PTR(val1, xr));
1094 START(ALIA, $<ctxt>$)
1099 { end_element(ELT_INDI_ALIA, PARENT, $<ctxt>5, NULL);
1104 indi_anci_sect : OPEN DELIM TAG_ANCI mand_pointer
1105 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1107 if (xr == NULL) HANDLE_ERROR;
1108 $<ctxt>$ = start_element(ELT_INDI_ANCI,
1110 GEDCOM_MAKE_XREF_PTR(val1, xr));
1111 START(ANCI, $<ctxt>$)
1116 { end_element(ELT_INDI_ANCI, PARENT, $<ctxt>5, NULL);
1121 indi_desi_sect : OPEN DELIM TAG_DESI mand_pointer
1122 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1124 if (xr == NULL) HANDLE_ERROR;
1125 $<ctxt>$ = start_element(ELT_INDI_DESI,
1127 GEDCOM_MAKE_XREF_PTR(val1, xr));
1128 START(DESI, $<ctxt>$)
1133 { end_element(ELT_INDI_DESI, PARENT, $<ctxt>5, NULL);
1138 indi_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1139 { $<ctxt>$ = start_element(ELT_INDI_RFN,
1141 GEDCOM_MAKE_STRING(val1, $4));
1142 START(RFN, $<ctxt>$)
1147 { end_element(ELT_INDI_RFN, PARENT, $<ctxt>5, NULL);
1152 indi_afn_sect : OPEN DELIM TAG_AFN mand_line_item
1153 { $<ctxt>$ = start_element(ELT_INDI_AFN,
1155 GEDCOM_MAKE_STRING(val1, $4));
1156 START(AFN, $<ctxt>$)
1161 { end_element(ELT_INDI_AFN, PARENT, $<ctxt>5, NULL);
1165 /* INDI.ADDR (Only for 'ftree' compatibility) */
1166 ftree_addr_sect : OPEN DELIM TAG_ADDR opt_line_item
1167 { START(ADDR, NULL) } no_std_subs { CHECK0 } CLOSE { }
1169 /*********************************************************************/
1170 /**** Multimedia record ****/
1171 /*********************************************************************/
1172 multim_rec : OPEN DELIM POINTER DELIM TAG_OBJE
1173 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1175 if (xr == NULL) HANDLE_ERROR;
1176 $<ctxt>$ = start_record(REC_OBJE,
1177 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1178 NULL, GEDCOM_MAKE_NULL(val2));
1179 START(OBJE, $<ctxt>$) }
1181 { CHECK2(FORM, BLOB) }
1183 { end_record(REC_OBJE, $<ctxt>6); }
1186 obje_subs : /* empty */
1187 | obje_subs obje_sub
1190 obje_sub : obje_form_sect { OCCUR2(FORM, 1, 1) }
1191 | obje_titl_sect { OCCUR2(TITL, 0, 1) }
1192 | note_struc_sub /* 0:M */
1193 | obje_blob_sect { OCCUR2(BLOB, 1, 1) }
1194 | obje_obje_sect { OCCUR2(OBJE, 0, 1) }
1195 | ident_struc_sub /* 0:1 */
1196 | change_date_sub /* 0:1 */
1201 obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
1202 { $<ctxt>$ = start_element(ELT_OBJE_FORM,
1204 GEDCOM_MAKE_STRING(val1, $4));
1205 START(FORM, $<ctxt>$)
1210 { end_element(ELT_OBJE_FORM, PARENT, $<ctxt>5, NULL);
1215 obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1216 { $<ctxt>$ = start_element(ELT_OBJE_TITL,
1218 GEDCOM_MAKE_STRING(val1, $4));
1219 START(TITL, $<ctxt>$)
1224 { end_element(ELT_OBJE_TITL, PARENT, $<ctxt>5, NULL);
1229 obje_blob_sect : OPEN DELIM TAG_BLOB
1230 { $<ctxt>$ = start_element(ELT_OBJE_BLOB,
1231 PARENT, $1, $3, NULL,
1232 GEDCOM_MAKE_NULL(val1));
1233 START(BLOB, $<ctxt>$)
1238 { end_element(ELT_OBJE_BLOB, PARENT, $<ctxt>4, NULL);
1242 obje_blob_subs : /* empty */
1243 | obje_blob_subs obje_blob_sub
1246 obje_blob_sub : obje_blob_cont_sect { OCCUR1(CONT, 1) }
1250 obje_blob_cont_sect : OPEN DELIM TAG_CONT mand_line_item
1251 { $<ctxt>$ = start_element(ELT_OBJE_BLOB_CONT,
1253 GEDCOM_MAKE_STRING(val1, $4));
1254 START(CONT, $<ctxt>$)
1259 { end_element(ELT_OBJE_BLOB_CONT, PARENT,
1265 obje_obje_sect : OPEN DELIM TAG_OBJE mand_pointer
1266 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1268 if (xr == NULL) HANDLE_ERROR;
1269 $<ctxt>$ = start_element(ELT_OBJE_OBJE,
1271 GEDCOM_MAKE_XREF_PTR(val1, xr));
1272 START(OBJE, $<ctxt>$)
1277 { end_element(ELT_OBJE_OBJE, PARENT, $<ctxt>5, NULL);
1281 /*********************************************************************/
1282 /**** Note record ****/
1283 /*********************************************************************/
1284 note_rec : OPEN DELIM POINTER DELIM TAG_NOTE note_line_item
1285 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1287 if (xr == NULL) HANDLE_ERROR;
1288 $<ctxt>$ = start_record(REC_NOTE,
1289 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1290 $6, GEDCOM_MAKE_STRING(val2, $6));
1291 START(NOTE, $<ctxt>$) }
1295 { end_record(REC_NOTE, $<ctxt>7); }
1298 note_line_item : /* empty */
1299 { if (!compat_mode(C_FTREE)) {
1300 gedcom_error(_("Missing value")); YYERROR;
1307 { gedcom_debug_print("==Val: %s==", $2);
1311 note_subs : /* empty */
1312 | note_subs note_sub
1315 note_sub : continuation_sub /* 0:M */
1316 | source_cit_sub /* 0:M */
1317 | ident_struc_sub /* 0:1 */
1318 | change_date_sub /* 0:1 */
1322 /*********************************************************************/
1323 /**** Repository record ****/
1324 /*********************************************************************/
1325 repos_rec : OPEN DELIM POINTER DELIM TAG_REPO
1326 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1328 if (xr == NULL) HANDLE_ERROR;
1329 $<ctxt>$ = start_record(REC_REPO,
1330 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1331 NULL, GEDCOM_MAKE_NULL(val2));
1332 START(REPO, $<ctxt>$) }
1336 { end_record(REC_REPO, $<ctxt>6); }
1339 repo_subs : /* empty */
1340 | repo_subs repo_sub
1343 repo_sub : repo_name_sect { OCCUR2(NAME, 0, 1) }
1344 | addr_struc_sub /* 0:1 */
1345 | note_struc_sub /* 0:M */
1346 | ident_struc_sub /* 0:1 */
1347 | change_date_sub /* 0:1 */
1352 repo_name_sect : OPEN DELIM TAG_NAME mand_line_item
1353 { $<ctxt>$ = start_element(ELT_REPO_NAME,
1355 GEDCOM_MAKE_STRING(val1, $4));
1356 START(NAME, $<ctxt>$)
1361 { end_element(ELT_REPO_NAME, PARENT, $<ctxt>5, NULL);
1365 /*********************************************************************/
1366 /**** Source record ****/
1367 /*********************************************************************/
1368 source_rec : OPEN DELIM POINTER DELIM TAG_SOUR
1369 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1371 if (xr == NULL) HANDLE_ERROR;
1372 $<ctxt>$ = start_record(REC_SOUR,
1373 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1374 NULL, GEDCOM_MAKE_NULL(val2));
1375 START(SOUR, $<ctxt>$) }
1379 { end_record(REC_SOUR, $<ctxt>6); }
1382 sour_subs : /* empty */
1383 | sour_subs sour_sub
1386 sour_sub : sour_data_sect { OCCUR2(DATA, 0, 1) }
1387 | sour_auth_sect { OCCUR2(AUTH, 0, 1) }
1388 | sour_titl_sect { OCCUR2(TITL, 0, 1) }
1389 | sour_abbr_sect { OCCUR2(ABBR, 0, 1) }
1390 | sour_publ_sect { OCCUR2(PUBL, 0, 1) }
1391 | sour_text_sect { OCCUR2(TEXT, 0, 1) }
1392 | source_repos_cit_sub /* 0:1 */
1393 | multim_link_sub /* 0:M */
1394 | note_struc_sub /* 0:M */
1395 | ident_struc_sub /* 0:1 */
1396 | change_date_sub /* 0:1 */
1401 sour_data_sect : OPEN DELIM TAG_DATA
1402 { $<ctxt>$ = start_element(ELT_SOUR_DATA,
1403 PARENT, $1, $3, NULL,
1404 GEDCOM_MAKE_NULL(val1));
1405 START(DATA, $<ctxt>$)
1410 { end_element(ELT_SOUR_DATA, PARENT, $<ctxt>4, NULL);
1414 sour_data_subs : /* empty */
1415 | sour_data_subs sour_data_sub
1418 sour_data_sub : sour_data_even_sect /* 0:M */
1419 | sour_data_agnc_sect { OCCUR2(AGNC, 0, 1) }
1420 | note_struc_sub /* 0:M */
1424 sour_data_even_sect : OPEN DELIM TAG_EVEN mand_line_item
1425 { $<ctxt>$ = start_element(ELT_SOUR_DATA_EVEN,
1427 GEDCOM_MAKE_STRING(val1, $4));
1428 START(EVEN, $<ctxt>$)
1433 { end_element(ELT_SOUR_DATA_EVEN, PARENT,
1438 sour_data_even_subs : /* empty */
1439 | sour_data_even_subs sour_data_even_sub
1442 sour_data_even_sub : sour_data_even_date_sect { OCCUR2(DATE, 0, 1) }
1443 | sour_data_even_plac_sect { OCCUR2(PLAC, 0, 1) }
1447 sour_data_even_date_sect : OPEN DELIM TAG_DATE mand_line_item
1448 { struct date_value dv = gedcom_parse_date($4);
1450 = start_element(ELT_SOUR_DATA_EVEN_DATE,
1452 GEDCOM_MAKE_DATE(val1, dv));
1453 START(DATE, $<ctxt>$)
1458 { end_element(ELT_SOUR_DATA_EVEN_DATE, PARENT,
1463 sour_data_even_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
1465 = start_element(ELT_SOUR_DATA_EVEN_PLAC,
1467 GEDCOM_MAKE_STRING(val1, $4));
1468 START(PLAC, $<ctxt>$)
1473 { end_element(ELT_SOUR_DATA_EVEN_PLAC, PARENT,
1478 sour_data_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
1479 { $<ctxt>$ = start_element(ELT_SOUR_DATA_AGNC,
1481 GEDCOM_MAKE_STRING(val1, $4));
1482 START(AGNC, $<ctxt>$)
1487 { end_element(ELT_SOUR_DATA_AGNC, PARENT,
1493 sour_auth_sect : OPEN DELIM TAG_AUTH mand_line_item
1494 { $<ctxt>$ = start_element(ELT_SOUR_AUTH,
1496 GEDCOM_MAKE_STRING(val1, $4));
1497 START(AUTH, $<ctxt>$)
1502 { end_element(ELT_SOUR_AUTH, PARENT, $<ctxt>5, NULL);
1506 sour_auth_subs : /* empty */
1507 | sour_auth_subs sour_auth_sub
1510 sour_auth_sub : continuation_sub /* 0:M */
1515 sour_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1516 { $<ctxt>$ = start_element(ELT_SOUR_TITL,
1518 GEDCOM_MAKE_STRING(val1, $4));
1519 START(TITL, $<ctxt>$)
1524 { end_element(ELT_SOUR_TITL, PARENT, $<ctxt>5, NULL);
1528 sour_titl_subs : /* empty */
1529 | sour_titl_subs sour_titl_sub
1532 sour_titl_sub : continuation_sub /* 0:M */
1537 sour_abbr_sect : OPEN DELIM TAG_ABBR mand_line_item
1538 { $<ctxt>$ = start_element(ELT_SOUR_ABBR,
1540 GEDCOM_MAKE_STRING(val1, $4));
1541 START(ABBR, $<ctxt>$)
1546 { end_element(ELT_SOUR_ABBR, PARENT, $<ctxt>5, NULL);
1551 sour_publ_sect : OPEN DELIM TAG_PUBL mand_line_item
1552 { $<ctxt>$ = start_element(ELT_SOUR_PUBL,
1554 GEDCOM_MAKE_STRING(val1, $4));
1555 START(PUBL, $<ctxt>$)
1560 { end_element(ELT_SOUR_PUBL, PARENT, $<ctxt>5, NULL);
1564 sour_publ_subs : /* empty */
1565 | sour_publ_subs sour_publ_sub
1568 sour_publ_sub : continuation_sub /* 0:M */
1573 sour_text_sect : OPEN DELIM TAG_TEXT mand_line_item
1574 { $<ctxt>$ = start_element(ELT_SOUR_TEXT,
1576 GEDCOM_MAKE_STRING(val1, $4));
1577 START(TEXT, $<ctxt>$)
1582 { end_element(ELT_SOUR_TEXT, PARENT, $<ctxt>5, NULL);
1586 sour_text_subs : /* empty */
1587 | sour_text_subs sour_text_sub
1590 sour_text_sub : continuation_sub /* 0:M */
1594 /*********************************************************************/
1595 /**** Submission record ****/
1596 /*********************************************************************/
1597 submis_rec : OPEN DELIM POINTER DELIM TAG_SUBN
1598 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1600 if (xr == NULL) HANDLE_ERROR;
1601 $<ctxt>$ = start_record(REC_SUBN,
1602 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1603 NULL, GEDCOM_MAKE_NULL(val2));
1604 START(SUBN, $<ctxt>$) }
1608 { end_record(REC_SUBN, $<ctxt>6); }
1611 subn_subs : /* empty */
1612 | subn_subs subn_sub
1615 subn_sub : subn_subm_sect { OCCUR2(SUBM, 0, 1) }
1616 | subn_famf_sect { OCCUR2(FAMF, 0, 1) }
1617 | subn_temp_sect { OCCUR2(TEMP, 0, 1) }
1618 | subn_ance_sect { OCCUR2(ANCE, 0, 1) }
1619 | subn_desc_sect { OCCUR2(DESC, 0, 1) }
1620 | subn_ordi_sect { OCCUR2(ORDI, 0, 1) }
1621 | subn_rin_sect { OCCUR2(RIN, 0, 1) }
1626 subn_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1627 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1629 if (xr == NULL) HANDLE_ERROR;
1630 $<ctxt>$ = start_element(ELT_SUBN_SUBM,
1632 GEDCOM_MAKE_XREF_PTR(val1, xr));
1633 START(SUBM, $<ctxt>$)
1638 { end_element(ELT_SUBN_SUBM, PARENT, $<ctxt>5, NULL);
1643 subn_famf_sect : OPEN DELIM TAG_FAMF mand_line_item
1644 { $<ctxt>$ = start_element(ELT_SUBN_FAMF,
1646 GEDCOM_MAKE_STRING(val1, $4));
1647 START(FAMF, $<ctxt>$)
1652 { end_element(ELT_SUBN_FAMF, PARENT, $<ctxt>5, NULL);
1657 subn_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
1658 { $<ctxt>$ = start_element(ELT_SUBN_TEMP,
1660 GEDCOM_MAKE_STRING(val1, $4));
1661 START(TEMP, $<ctxt>$)
1666 { end_element(ELT_SUBN_TEMP, PARENT, $<ctxt>5, NULL);
1671 subn_ance_sect : OPEN DELIM TAG_ANCE mand_line_item
1672 { $<ctxt>$ = start_element(ELT_SUBN_ANCE,
1674 GEDCOM_MAKE_STRING(val1, $4));
1675 START(ANCE, $<ctxt>$)
1680 { end_element(ELT_SUBN_ANCE, PARENT, $<ctxt>5, NULL);
1685 subn_desc_sect : OPEN DELIM TAG_DESC mand_line_item
1686 { $<ctxt>$ = start_element(ELT_SUBN_DESC,
1688 GEDCOM_MAKE_STRING(val1, $4));
1689 START(DESC, $<ctxt>$)
1694 { end_element(ELT_SUBN_DESC, PARENT, $<ctxt>5, NULL);
1699 subn_ordi_sect : OPEN DELIM TAG_ORDI mand_line_item
1700 { $<ctxt>$ = start_element(ELT_SUBN_ORDI,
1702 GEDCOM_MAKE_STRING(val1, $4));
1703 START(ORDI, $<ctxt>$)
1708 { end_element(ELT_SUBN_ORDI, PARENT, $<ctxt>5, NULL);
1713 subn_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1714 { $<ctxt>$ = start_element(ELT_SUBN_RIN,
1716 GEDCOM_MAKE_STRING(val1, $4));
1717 START(RIN, $<ctxt>$)
1722 { end_element(ELT_SUBN_RIN, PARENT, $<ctxt>5, NULL);
1726 /*********************************************************************/
1727 /**** Submitter record ****/
1728 /*********************************************************************/
1729 submit_rec : OPEN DELIM POINTER DELIM TAG_SUBM
1730 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1732 if (xr == NULL) HANDLE_ERROR;
1733 $<ctxt>$ = start_record(REC_SUBM,
1734 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1735 NULL, GEDCOM_MAKE_NULL(val2));
1736 START(SUBM, $<ctxt>$) }
1740 { end_record(REC_SUBM, $<ctxt>6); }
1743 subm_subs : /* empty */
1744 | subm_subs subm_sub
1747 subm_sub : subm_name_sect { OCCUR2(NAME, 0, 1) }
1748 | addr_struc_sub /* 0:1 */
1749 | multim_link_sub /* 0:M */
1750 | subm_lang_sect { OCCUR2(LANG, 0, 3) }
1751 | subm_rfn_sect { OCCUR2(RFN, 0, 1) }
1752 | subm_rin_sect { OCCUR2(RIN, 0, 1) }
1753 | change_date_sub /* 0:1 */
1758 subm_name_sect : OPEN DELIM TAG_NAME mand_line_item
1759 { $<ctxt>$ = start_element(ELT_SUBM_NAME,
1761 GEDCOM_MAKE_STRING(val1, $4));
1762 START(NAME, $<ctxt>$)
1767 { end_element(ELT_SUBM_NAME, PARENT, $<ctxt>5, NULL);
1772 subm_lang_sect : OPEN DELIM TAG_LANG mand_line_item
1773 { $<ctxt>$ = start_element(ELT_SUBM_LANG,
1775 GEDCOM_MAKE_STRING(val1, $4));
1776 START(LANG, $<ctxt>$)
1781 { end_element(ELT_SUBM_LANG, PARENT, $<ctxt>5, NULL);
1786 subm_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1787 { $<ctxt>$ = start_element(ELT_SUBM_RFN,
1789 GEDCOM_MAKE_STRING(val1, $4));
1790 START(RFN, $<ctxt>$)
1795 { end_element(ELT_SUBM_RFN, PARENT, $<ctxt>5, NULL);
1800 subm_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1801 { $<ctxt>$ = start_element(ELT_SUBM_RIN,
1803 GEDCOM_MAKE_STRING(val1, $4));
1804 START(RIN, $<ctxt>$)
1809 { end_element(ELT_SUBM_RIN, PARENT, $<ctxt>5, NULL);
1813 /*********************************************************************/
1814 /**** Substructures ****/
1815 /*********************************************************************/
1817 /* ADDRESS STRUCTURE */
1818 addr_struc_sub : addr_sect { OCCUR2(ADDR, 0, 1) }
1819 | phon_sect { OCCUR2(PHON, 0, 3) }
1822 addr_sect : OPEN DELIM TAG_ADDR mand_line_item
1823 { $<ctxt>$ = start_element(ELT_SUB_ADDR,
1825 GEDCOM_MAKE_STRING(val1, $4));
1826 START(ADDR, $<ctxt>$)
1831 { end_element(ELT_SUB_ADDR, PARENT, $<ctxt>5, NULL);
1835 addr_subs : /* empty */
1836 | addr_subs addr_sub
1839 addr_sub : addr_cont_sect /* 0:M */
1840 | addr_adr1_sect { OCCUR2(ADR1, 0, 1) }
1841 | addr_adr2_sect { OCCUR2(ADR2, 0, 1) }
1842 | addr_city_sect { OCCUR2(CITY, 0, 1) }
1843 | addr_stae_sect { OCCUR2(STAE, 0, 1) }
1844 | addr_post_sect { OCCUR2(POST, 0, 1) }
1845 | addr_ctry_sect { OCCUR2(CTRY, 0, 1) }
1849 addr_cont_sect : OPEN DELIM TAG_CONT mand_line_item
1850 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CONT,
1852 GEDCOM_MAKE_STRING(val1, $4));
1853 START(CONT, $<ctxt>$)
1858 { end_element(ELT_SUB_ADDR_CONT, PARENT, $<ctxt>5, NULL);
1861 addr_adr1_sect : OPEN DELIM TAG_ADR1 mand_line_item
1862 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR1,
1864 GEDCOM_MAKE_STRING(val1, $4));
1865 START(ADR1, $<ctxt>$)
1870 { end_element(ELT_SUB_ADDR_ADR1, PARENT, $<ctxt>5, NULL);
1873 addr_adr2_sect : OPEN DELIM TAG_ADR2 mand_line_item
1874 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR2,
1876 GEDCOM_MAKE_STRING(val1, $4));
1877 START(ADR2, $<ctxt>$)
1882 { end_element(ELT_SUB_ADDR_ADR2, PARENT, $<ctxt>5, NULL);
1885 addr_city_sect : OPEN DELIM TAG_CITY mand_line_item
1886 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CITY,
1888 GEDCOM_MAKE_STRING(val1, $4));
1889 START(CITY, $<ctxt>$)
1894 { end_element(ELT_SUB_ADDR_CITY, PARENT, $<ctxt>5, NULL);
1897 addr_stae_sect : OPEN DELIM TAG_STAE mand_line_item
1898 { $<ctxt>$ = start_element(ELT_SUB_ADDR_STAE,
1900 GEDCOM_MAKE_STRING(val1, $4));
1901 START(STAE, $<ctxt>$)
1906 { end_element(ELT_SUB_ADDR_STAE, PARENT, $<ctxt>5, NULL);
1909 addr_post_sect : OPEN DELIM TAG_POST mand_line_item
1910 { $<ctxt>$ = start_element(ELT_SUB_ADDR_POST,
1912 GEDCOM_MAKE_STRING(val1, $4));
1913 START(POST, $<ctxt>$)
1918 { end_element(ELT_SUB_ADDR_POST, PARENT, $<ctxt>5, NULL);
1921 addr_ctry_sect : OPEN DELIM TAG_CTRY mand_line_item
1922 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CTRY,
1924 GEDCOM_MAKE_STRING(val1, $4));
1925 START(CTRY, $<ctxt>$)
1930 { end_element(ELT_SUB_ADDR_CTRY, PARENT, $<ctxt>5, NULL);
1934 phon_sect : OPEN DELIM TAG_PHON mand_line_item
1935 { $<ctxt>$ = start_element(ELT_SUB_PHON,
1937 GEDCOM_MAKE_STRING(val1, $4));
1938 START(PHON, $<ctxt>$)
1943 { end_element(ELT_SUB_PHON, PARENT, $<ctxt>5, NULL);
1947 /* ASSOCIATION STRUCTURE */
1948 assoc_struc_sub : asso_sect /* 0:M */
1951 asso_sect : OPEN DELIM TAG_ASSO mand_pointer
1952 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1954 if (xr == NULL) HANDLE_ERROR;
1955 $<ctxt>$ = start_element(ELT_SUB_ASSO,
1957 GEDCOM_MAKE_XREF_PTR(val1, xr));
1958 START(ASSO, $<ctxt>$)
1961 { CHECK2(TYPE,RELA) }
1963 { end_element(ELT_SUB_ASSO, PARENT, $<ctxt>5, NULL);
1967 asso_subs : /* empty */
1968 | asso_type_sect { OCCUR2(TYPE, 1, 1) }
1969 | asso_rela_sect { OCCUR2(RELA, 1, 1) }
1975 asso_type_sect : OPEN DELIM TAG_TYPE mand_line_item
1976 { $<ctxt>$ = start_element(ELT_SUB_ASSO_TYPE,
1978 GEDCOM_MAKE_STRING(val1, $4));
1979 START(TYPE, $<ctxt>$)
1984 { end_element(ELT_SUB_ASSO_TYPE, PARENT, $<ctxt>5, NULL);
1988 asso_rela_sect : OPEN DELIM TAG_RELA mand_line_item
1989 { $<ctxt>$ = start_element(ELT_SUB_ASSO_RELA,
1991 GEDCOM_MAKE_STRING(val1, $4));
1992 START(RELA, $<ctxt>$)
1997 { end_element(ELT_SUB_ASSO_RELA, PARENT, $<ctxt>5, NULL);
2002 change_date_sub : change_date_chan_sect { OCCUR2(CHAN, 0, 1) }
2005 change_date_chan_sect : OPEN DELIM TAG_CHAN
2006 { $<ctxt>$ = start_element(ELT_SUB_CHAN,
2007 PARENT, $1, $3, NULL,
2008 GEDCOM_MAKE_NULL(val1));
2009 START(CHAN, $<ctxt>$)
2011 change_date_chan_subs
2014 { end_element(ELT_SUB_CHAN, PARENT, $<ctxt>4, NULL);
2018 change_date_chan_subs : /* empty */
2019 | change_date_chan_subs change_date_chan_sub
2022 change_date_chan_sub : change_date_date_sect { OCCUR2(DATE, 1, 1) }
2027 change_date_date_sect : OPEN DELIM TAG_DATE mand_line_item
2028 { struct date_value dv = gedcom_parse_date($4);
2029 $<ctxt>$ = start_element(ELT_SUB_CHAN_DATE,
2031 GEDCOM_MAKE_DATE(val1, dv));
2032 START(DATE, $<ctxt>$) }
2033 change_date_date_subs
2036 { end_element(ELT_SUB_CHAN_DATE, PARENT, $<ctxt>5,
2041 change_date_date_subs : /* empty */
2042 | change_date_date_subs change_date_date_sub
2045 change_date_date_sub : change_date_date_time_sect { OCCUR2(TIME, 0, 1) }
2049 change_date_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
2051 = start_element(ELT_SUB_CHAN_TIME,
2053 GEDCOM_MAKE_STRING(val1, $4));
2054 START(TIME, $<ctxt>$)
2059 { end_element(ELT_SUB_CHAN_TIME, PARENT, $<ctxt>5,
2064 /* CHILD TO FAMILY LINK */
2065 chi_fam_link_sub : famc_sect /* 0:M */
2068 famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2069 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2071 if (xr == NULL) HANDLE_ERROR;
2072 $<ctxt>$ = start_element(ELT_SUB_FAMC,
2074 GEDCOM_MAKE_XREF_PTR(val1, xr));
2075 START(FAMC, $<ctxt>$)
2080 { end_element(ELT_SUB_FAMC, PARENT, $<ctxt>5, NULL);
2084 famc_subs : /* empty */
2085 | famc_subs famc_sub
2088 famc_sub : famc_pedi_sect /* 0:M */
2093 famc_pedi_sect : OPEN DELIM TAG_PEDI mand_line_item
2094 { $<ctxt>$ = start_element(ELT_SUB_FAMC_PEDI,
2096 GEDCOM_MAKE_STRING(val1, $4));
2097 START(PEDI, $<ctxt>$)
2102 { end_element(ELT_SUB_FAMC_PEDI, PARENT, $<ctxt>5, NULL);
2106 /* CONTINUATION SUBSECTIONS */
2107 continuation_sub : cont_sect /* 0:M */
2108 | conc_sect /* 0:M */
2111 cont_sect : OPEN DELIM TAG_CONT mand_line_item
2112 { $<ctxt>$ = start_element(ELT_SUB_CONT,
2114 GEDCOM_MAKE_STRING(val1, $4));
2115 START(CONT, $<ctxt>$)
2120 { end_element(ELT_SUB_CONT, PARENT, $<ctxt>5, NULL);
2124 conc_sect : OPEN DELIM TAG_CONC mand_line_item
2125 { $<ctxt>$ = start_element(ELT_SUB_CONC,
2127 GEDCOM_MAKE_STRING(val1, $4));
2128 START(CONC, $<ctxt>$)
2133 { end_element(ELT_SUB_CONC, PARENT, $<ctxt>5, NULL);
2138 event_detail_sub : event_detail_type_sect { OCCUR2(TYPE, 0, 1) }
2139 | event_detail_date_sect { OCCUR2(DATE, 0, 1) }
2142 | event_detail_age_sect { OCCUR2(AGE, 0, 1) }
2143 | event_detail_agnc_sect { OCCUR2(AGNC, 0, 1) }
2144 | event_detail_caus_sect { OCCUR2(CAUS, 0, 1) }
2150 event_detail_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2152 = start_element(ELT_SUB_EVT_TYPE,
2154 GEDCOM_MAKE_STRING(val1, $4));
2155 START(TYPE, $<ctxt>$)
2160 { end_element(ELT_SUB_EVT_TYPE, PARENT, $<ctxt>5,
2164 event_detail_date_sect : OPEN DELIM TAG_DATE mand_line_item
2165 { struct date_value dv = gedcom_parse_date($4);
2167 = start_element(ELT_SUB_EVT_DATE,
2169 GEDCOM_MAKE_DATE(val1, dv));
2170 START(DATE, $<ctxt>$)
2175 { end_element(ELT_SUB_EVT_DATE, PARENT, $<ctxt>5,
2179 event_detail_age_sect : OPEN DELIM TAG_AGE mand_line_item
2181 = start_element(ELT_SUB_EVT_AGE,
2183 GEDCOM_MAKE_STRING(val1, $4));
2184 START(AGE, $<ctxt>$)
2189 { end_element(ELT_SUB_EVT_AGE, PARENT, $<ctxt>5,
2193 event_detail_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
2195 = start_element(ELT_SUB_EVT_AGNC,
2197 GEDCOM_MAKE_STRING(val1, $4));
2198 START(AGNC, $<ctxt>$)
2203 { end_element(ELT_SUB_EVT_AGNC, PARENT, $<ctxt>5,
2207 event_detail_caus_sect : OPEN DELIM TAG_CAUS mand_line_item
2209 = start_element(ELT_SUB_EVT_CAUS,
2211 GEDCOM_MAKE_STRING(val1, $4));
2212 START(CAUS, $<ctxt>$)
2217 { end_element(ELT_SUB_EVT_CAUS, PARENT, $<ctxt>5,
2222 /* FAMILY EVENT STRUCTURE */
2223 fam_event_struc_sub : fam_event_sect
2224 | fam_gen_even_sect /* 0:M */
2227 fam_event_sect : OPEN DELIM fam_event_tag opt_value
2229 = start_element(ELT_SUB_FAM_EVT,
2231 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2237 { end_element(ELT_SUB_FAM_EVT, PARENT, $<ctxt>5, NULL);
2241 fam_event_tag : TAG_ANUL { $$ = $1; START1(ANUL) }
2242 | TAG_CENS { $$ = $1; START1(CENS) }
2243 | TAG_DIV { $$ = $1; START1(DIV) }
2244 | TAG_DIVF { $$ = $1; START1(DIVF) }
2245 | TAG_ENGA { $$ = $1; START1(ENGA) }
2246 | TAG_MARR { $$ = $1; START1(MARR) }
2247 | TAG_MARB { $$ = $1; START1(MARB) }
2248 | TAG_MARC { $$ = $1; START1(MARC) }
2249 | TAG_MARL { $$ = $1; START1(MARL) }
2250 | TAG_MARS { $$ = $1; START1(MARS) }
2253 fam_event_subs : /* empty */
2254 | fam_event_subs fam_event_sub
2257 fam_event_sub : event_detail_sub
2258 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2259 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2263 fam_even_husb_sect : OPEN DELIM TAG_HUSB
2264 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_HUSB,
2265 PARENT, $1, $3, NULL,
2266 GEDCOM_MAKE_NULL(val1));
2267 START(HUSB, $<ctxt>$)
2272 { end_element(ELT_SUB_FAM_EVT_HUSB, PARENT, $<ctxt>4,
2277 fam_even_husb_subs : /* empty */
2278 | fam_even_husb_subs fam_even_husb_sub
2281 fam_even_husb_sub : fam_even_age_sect { OCCUR2(AGE, 1, 1) }
2285 fam_even_age_sect : OPEN DELIM TAG_AGE mand_line_item
2286 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_AGE,
2288 GEDCOM_MAKE_STRING(val1, $4));
2289 START(AGE, $<ctxt>$)
2294 { end_element(ELT_SUB_FAM_EVT_AGE, PARENT, $<ctxt>5,
2299 fam_even_wife_sect : OPEN DELIM TAG_WIFE
2300 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_WIFE,
2301 PARENT, $1, $3, NULL,
2302 GEDCOM_MAKE_NULL(val1));
2303 START(WIFE, $<ctxt>$)
2308 { end_element(ELT_SUB_FAM_EVT_WIFE, PARENT, $<ctxt>4,
2313 fam_gen_even_sect : OPEN DELIM TAG_EVEN
2314 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_EVEN,
2315 PARENT, $1, $3, NULL,
2316 GEDCOM_MAKE_NULL(val1));
2317 START(EVEN, $<ctxt>$)
2322 { end_element(ELT_SUB_FAM_EVT_EVEN, PARENT, $<ctxt>4,
2327 fam_gen_even_subs : /* empty */
2328 | fam_gen_even_subs fam_gen_even_sub
2331 fam_gen_even_sub : event_detail_sub
2332 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2333 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2337 /* IDENTIFICATION STRUCTURE */
2338 ident_struc_sub : ident_refn_sect /* 0:M */
2339 | ident_rin_sect { OCCUR2(RIN, 0, 1) }
2342 ident_refn_sect : OPEN DELIM TAG_REFN mand_line_item
2343 { $<ctxt>$ = start_element(ELT_SUB_IDENT_REFN,
2345 GEDCOM_MAKE_STRING(val1, $4));
2346 START(REFN, $<ctxt>$)
2351 { end_element(ELT_SUB_IDENT_REFN, PARENT, $<ctxt>5,
2356 ident_refn_subs : /* empty */
2357 | ident_refn_subs ident_refn_sub
2360 ident_refn_sub : ident_refn_type_sect { OCCUR2(TYPE, 0, 1) }
2364 ident_refn_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2366 = start_element(ELT_SUB_IDENT_REFN_TYPE,
2368 GEDCOM_MAKE_STRING(val1, $4));
2369 START(TYPE, $<ctxt>$)
2374 { end_element(ELT_SUB_IDENT_REFN_TYPE, PARENT, $<ctxt>5,
2379 ident_rin_sect : OPEN DELIM TAG_RIN mand_line_item
2380 { $<ctxt>$ = start_element(ELT_SUB_IDENT_RIN,
2382 GEDCOM_MAKE_STRING(val1, $4));
2383 START(RIN, $<ctxt>$)
2388 { end_element(ELT_SUB_IDENT_RIN, PARENT, $<ctxt>5,
2393 /* INDIVIDUAL ATTRIBUTE STRUCTURE */
2394 indiv_attr_struc_sub : indiv_attr_sect /* 0:M */
2395 | indiv_resi_sect /* 0:M */
2398 indiv_attr_sect : OPEN DELIM indiv_attr_tag mand_line_item
2399 { $<ctxt>$ = start_element(ELT_SUB_INDIV_ATTR,
2401 GEDCOM_MAKE_STRING(val1, $4));
2404 indiv_attr_event_subs
2407 { end_element(ELT_SUB_INDIV_ATTR, PARENT, $<ctxt>5, NULL);
2410 indiv_attr_tag : TAG_CAST { $$ = $1; START1(CAST) }
2411 | TAG_DSCR { $$ = $1; START1(DSCR) }
2412 | TAG_EDUC { $$ = $1; START1(EDUC) }
2413 | TAG_IDNO { $$ = $1; START1(IDNO) }
2414 | TAG_NATI { $$ = $1; START1(NATI) }
2415 | TAG_NCHI { $$ = $1; START1(NCHI) }
2416 | TAG_NMR { $$ = $1; START1(NMR) }
2417 | TAG_OCCU { $$ = $1; START1(OCCU) }
2418 | TAG_PROP { $$ = $1; START1(PROP) }
2419 | TAG_RELI { $$ = $1; START1(RELI) }
2420 | TAG_SSN { $$ = $1; START1(SSN) }
2421 | TAG_TITL { $$ = $1; START1(TITL) }
2423 indiv_resi_sect : OPEN DELIM TAG_RESI
2424 { $<ctxt>$ = start_element(ELT_SUB_INDIV_RESI,
2425 PARENT, $1, $3, NULL,
2426 GEDCOM_MAKE_NULL(val1));
2427 START(RESI, $<ctxt>$)
2429 indiv_attr_event_subs
2432 { end_element(ELT_SUB_INDIV_RESI, PARENT, $<ctxt>4, NULL);
2436 indiv_attr_event_subs : /* empty */
2437 | indiv_attr_event_subs indiv_attr_event_sub
2440 indiv_attr_event_sub : event_detail_sub
2444 /* INDIVIDUAL EVENT STRUCTURE */
2445 indiv_even_struc_sub : indiv_birt_sect
2447 | indiv_adop_sect /* 0:M */
2448 | indiv_even_sect /* 0:M */
2451 indiv_birt_sect : OPEN DELIM indiv_birt_tag opt_value
2453 = start_element(ELT_SUB_INDIV_BIRT,
2455 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2461 { end_element(ELT_SUB_INDIV_BIRT, PARENT, $<ctxt>5, NULL);
2465 indiv_birt_tag : TAG_BIRT { $$ = $1; START1(BIRT) }
2466 | TAG_CHR { $$ = $1; START1(CHR) }
2469 indiv_birt_subs : /* empty */
2470 | indiv_birt_subs indiv_birt_sub
2473 indiv_birt_sub : event_detail_sub
2474 | indiv_birt_famc_sect { OCCUR2(FAMC,0, 1) }
2478 indiv_birt_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2479 { struct xref_value *xr = gedcom_parse_xref($4,
2482 if (xr == NULL) HANDLE_ERROR;
2484 = start_element(ELT_SUB_INDIV_BIRT_FAMC,
2486 GEDCOM_MAKE_XREF_PTR(val1, xr));
2487 START(FAMC, $<ctxt>$)
2492 { end_element(ELT_SUB_INDIV_BIRT_FAMC, PARENT, $<ctxt>5,
2497 indiv_gen_sect : OPEN DELIM indiv_gen_tag opt_value
2499 = start_element(ELT_SUB_INDIV_GEN,
2501 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2507 { end_element(ELT_SUB_INDIV_GEN, PARENT, $<ctxt>5, NULL);
2511 indiv_gen_tag : TAG_DEAT { $$ = $1; START1(DEAT) }
2512 | TAG_BURI { $$ = $1; START1(BURI) }
2513 | TAG_CREM { $$ = $1; START1(CREM) }
2514 | TAG_BAPM { $$ = $1; START1(BAPM) }
2515 | TAG_BARM { $$ = $1; START1(BARM) }
2516 | TAG_BASM { $$ = $1; START1(BASM) }
2517 | TAG_BLES { $$ = $1; START1(BLES) }
2518 | TAG_CHRA { $$ = $1; START1(CHRA) }
2519 | TAG_CONF { $$ = $1; START1(CONF) }
2520 | TAG_FCOM { $$ = $1; START1(FCOM) }
2521 | TAG_ORDN { $$ = $1; START1(ORDN) }
2522 | TAG_NATU { $$ = $1; START1(NATU) }
2523 | TAG_EMIG { $$ = $1; START1(EMIG) }
2524 | TAG_IMMI { $$ = $1; START1(IMMI) }
2525 | TAG_CENS { $$ = $1; START1(CENS) }
2526 | TAG_PROB { $$ = $1; START1(PROB) }
2527 | TAG_WILL { $$ = $1; START1(WILL) }
2528 | TAG_GRAD { $$ = $1; START1(GRAD) }
2529 | TAG_RETI { $$ = $1; START1(RETI) }
2532 indiv_gen_subs : /* empty */
2533 | indiv_gen_subs indiv_gen_sub
2536 indiv_gen_sub : event_detail_sub
2540 indiv_adop_sect : OPEN DELIM TAG_ADOP opt_value
2542 = start_element(ELT_SUB_INDIV_ADOP,
2544 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2545 START(ADOP, $<ctxt>$) }
2549 { end_element(ELT_SUB_INDIV_ADOP, PARENT, $<ctxt>5, NULL);
2553 indiv_adop_subs : /* empty */
2554 | indiv_adop_subs indiv_adop_sub
2557 indiv_adop_sub : event_detail_sub
2558 | indiv_adop_famc_sect { OCCUR2(FAMC,0, 1) }
2562 indiv_adop_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2563 { struct xref_value *xr = gedcom_parse_xref($4,
2566 if (xr == NULL) HANDLE_ERROR;
2568 = start_element(ELT_SUB_INDIV_ADOP_FAMC,
2570 GEDCOM_MAKE_XREF_PTR(val1, xr));
2571 START(FAMC, $<ctxt>$) }
2572 indiv_adop_famc_subs
2575 { end_element(ELT_SUB_INDIV_ADOP_FAMC, PARENT, $<ctxt>5,
2580 indiv_adop_famc_subs : /* empty */
2581 | indiv_adop_famc_subs indiv_adop_famc_sub
2584 indiv_adop_famc_sub : indiv_adop_famc_adop_sect { OCCUR2(ADOP,0, 1) }
2588 indiv_adop_famc_adop_sect : OPEN DELIM TAG_ADOP mand_line_item
2590 = start_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2592 GEDCOM_MAKE_STRING(val1, $4));
2593 START(ADOP, $<ctxt>$) }
2597 { end_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2598 PARENT, $<ctxt>5, NULL);
2602 indiv_even_sect : OPEN DELIM TAG_EVEN
2603 { $<ctxt>$ = start_element(ELT_SUB_INDIV_EVEN,
2604 PARENT, $1, $3, NULL,
2605 GEDCOM_MAKE_NULL(val1));
2606 START(EVEN, $<ctxt>$) }
2610 { end_element(ELT_SUB_INDIV_EVEN, PARENT, $<ctxt>4, NULL);
2614 /* LDS INDIVIDUAL ORDINANCE */
2615 lds_indiv_ord_sub : lio_bapl_sect /* 0:M */
2616 | lio_slgc_sect /* 0:M */
2619 lio_bapl_sect : OPEN DELIM lio_bapl_tag
2620 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL,
2621 PARENT, $1, $3, NULL,
2622 GEDCOM_MAKE_NULL(val1));
2628 { end_element(ELT_SUB_LIO_BAPL, PARENT, $<ctxt>4, NULL);
2632 lio_bapl_tag : TAG_BAPL { $$ = $1; START1(BAPL) }
2633 | TAG_CONL { $$ = $1; START1(CONL) }
2634 | TAG_ENDL { $$ = $1; START1(ENDL) }
2637 lio_bapl_subs : /* empty */
2638 | lio_bapl_subs lio_bapl_sub
2641 lio_bapl_sub : lio_bapl_stat_sect { OCCUR2(STAT, 0, 1) }
2642 | lio_bapl_date_sect { OCCUR2(DATE, 0, 1) }
2643 | lio_bapl_temp_sect { OCCUR2(TEMP, 0, 1) }
2644 | lio_bapl_plac_sect { OCCUR2(PLAC, 0, 1) }
2650 lio_bapl_stat_sect : OPEN DELIM TAG_STAT mand_line_item
2651 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_STAT,
2653 GEDCOM_MAKE_STRING(val1, $4));
2654 START(STAT, $<ctxt>$)
2659 { end_element(ELT_SUB_LIO_BAPL_STAT, PARENT, $<ctxt>5,
2663 lio_bapl_date_sect : OPEN DELIM TAG_DATE mand_line_item
2664 { struct date_value dv = gedcom_parse_date($4);
2665 $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_DATE,
2667 GEDCOM_MAKE_DATE(val1, dv));
2668 START(DATE, $<ctxt>$)
2673 { end_element(ELT_SUB_LIO_BAPL_DATE, PARENT, $<ctxt>5,
2677 lio_bapl_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
2678 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_TEMP,
2680 GEDCOM_MAKE_STRING(val1, $4));
2681 START(TEMP, $<ctxt>$)
2686 { end_element(ELT_SUB_LIO_BAPL_TEMP, PARENT, $<ctxt>5,
2690 lio_bapl_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
2691 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_PLAC,
2693 GEDCOM_MAKE_STRING(val1, $4));
2694 START(PLAC, $<ctxt>$)
2699 { end_element(ELT_SUB_LIO_BAPL_PLAC, PARENT, $<ctxt>5,
2704 lio_slgc_sect : OPEN DELIM TAG_SLGC
2705 { $<ctxt>$ = start_element(ELT_SUB_LIO_SLGC,
2706 PARENT, $1, $3, NULL,
2707 GEDCOM_MAKE_NULL(val1));
2708 START(SLGC, $<ctxt>$)
2713 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4, NULL);
2717 lio_slgc_subs : /* empty */
2718 | lio_slgc_subs lio_slgc_sub
2721 lio_slgc_sub : lio_bapl_sub
2722 | lio_slgc_famc_sect { OCCUR2(FAMC, 1, 1) }
2725 lio_slgc_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2726 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2728 if (xr == NULL) HANDLE_ERROR;
2730 = start_element(ELT_SUB_LIO_SLGC_FAMC,
2732 GEDCOM_MAKE_XREF_PTR(val1, xr));
2733 START(FAMC, $<ctxt>$)
2738 { end_element(ELT_SUB_LIO_SLGC_FAMC, PARENT, $<ctxt>5,
2743 /* LDS SPOUSE SEALING */
2744 lds_spouse_seal_sub : lss_slgs_sect
2747 lss_slgs_sect : OPEN DELIM TAG_SLGS
2748 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS,
2749 PARENT, $1, $3, NULL,
2750 GEDCOM_MAKE_NULL(val1));
2751 START(SLGS, $<ctxt>$) }
2755 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4, NULL);
2759 lss_slgs_subs : /* empty */
2760 | lss_slgs_subs lss_slgs_sub
2763 lss_slgs_sub : lss_slgs_stat_sect { OCCUR2(STAT, 0, 1) }
2764 | lss_slgs_date_sect { OCCUR2(DATE, 0, 1) }
2765 | lss_slgs_temp_sect { OCCUR2(TEMP, 0, 1) }
2766 | lss_slgs_plac_sect { OCCUR2(PLAC, 0, 1) }
2772 lss_slgs_stat_sect : OPEN DELIM TAG_STAT mand_line_item
2773 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_STAT,
2775 GEDCOM_MAKE_STRING(val1, $4));
2776 START(STAT, $<ctxt>$)
2781 { end_element(ELT_SUB_LSS_SLGS_STAT, PARENT, $<ctxt>5,
2785 lss_slgs_date_sect : OPEN DELIM TAG_DATE mand_line_item
2786 { struct date_value dv = gedcom_parse_date($4);
2787 $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_DATE,
2789 GEDCOM_MAKE_DATE(val1, dv));
2790 START(DATE, $<ctxt>$)
2795 { end_element(ELT_SUB_LSS_SLGS_DATE, PARENT, $<ctxt>5,
2799 lss_slgs_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
2800 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_TEMP,
2802 GEDCOM_MAKE_STRING(val1, $4));
2803 START(TEMP, $<ctxt>$)
2808 { end_element(ELT_SUB_LSS_SLGS_TEMP, PARENT, $<ctxt>5,
2812 lss_slgs_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
2813 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_PLAC,
2815 GEDCOM_MAKE_STRING(val1, $4));
2816 START(PLAC, $<ctxt>$)
2821 { end_element(ELT_SUB_LSS_SLGS_PLAC, PARENT, $<ctxt>5,
2826 /* MULTIMEDIA LINK */
2827 multim_link_sub : multim_obje_link_sect
2828 | multim_obje_emb_sect
2831 multim_obje_link_sect : OPEN DELIM TAG_OBJE DELIM POINTER
2832 { struct xref_value *xr = gedcom_parse_xref($5,
2835 if (xr == NULL) HANDLE_ERROR;
2837 = start_element(ELT_SUB_MULTIM_OBJE,
2839 GEDCOM_MAKE_XREF_PTR(val1, xr));
2840 START(OBJE, $<ctxt>$)
2845 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>6,
2850 multim_obje_emb_sect : OPEN DELIM TAG_OBJE
2851 { $<ctxt>$ = start_element(ELT_SUB_MULTIM_OBJE,
2852 PARENT, $1, $3, NULL,
2853 GEDCOM_MAKE_NULL(val1));
2854 START(OBJE, $<ctxt>$)
2856 multim_obje_emb_subs
2857 { CHECK2(FORM,FILE) }
2859 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>4,
2864 multim_obje_emb_subs : /* empty */
2865 | multim_obje_emb_subs multim_obje_emb_sub
2868 multim_obje_emb_sub : multim_obje_form_sect { OCCUR2(FORM, 1, 1) }
2869 | multim_obje_titl_sect { OCCUR2(TITL, 0, 1) }
2870 | multim_obje_file_sect { OCCUR2(FILE, 1, 1) }
2875 multim_obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
2877 = start_element(ELT_SUB_MULTIM_OBJE_FORM,
2879 GEDCOM_MAKE_STRING(val1, $4));
2880 START(FORM, $<ctxt>$)
2885 { end_element(ELT_SUB_MULTIM_OBJE_FORM,
2886 PARENT, $<ctxt>5, NULL);
2889 multim_obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
2891 = start_element(ELT_SUB_MULTIM_OBJE_TITL,
2893 GEDCOM_MAKE_STRING(val1, $4));
2894 START(TITL, $<ctxt>$)
2899 { end_element(ELT_SUB_MULTIM_OBJE_TITL,
2900 PARENT, $<ctxt>5, NULL);
2903 multim_obje_file_sect : OPEN DELIM TAG_FILE mand_line_item
2905 = start_element(ELT_SUB_MULTIM_OBJE_FILE,
2907 GEDCOM_MAKE_STRING(val1, $4));
2908 START(FILE, $<ctxt>$)
2913 { end_element(ELT_SUB_MULTIM_OBJE_FILE,
2914 PARENT, $<ctxt>5, NULL);
2918 /* NOTE STRUCTURE */
2919 note_struc_sub : note_struc_link_sect /* 0:M */
2920 | note_struc_emb_sect /* 0:M */
2923 note_struc_link_sect : OPEN DELIM TAG_NOTE DELIM POINTER
2924 { struct xref_value *xr = gedcom_parse_xref($5,
2927 if (xr == NULL) HANDLE_ERROR;
2929 = start_element(ELT_SUB_NOTE,
2931 GEDCOM_MAKE_XREF_PTR(val1, xr));
2932 START(NOTE, $<ctxt>$)
2934 note_struc_link_subs
2937 { end_element(ELT_SUB_NOTE, PARENT, $<ctxt>6, NULL);
2941 note_struc_link_subs : /* empty */
2942 | note_struc_link_subs note_struc_link_sub
2945 note_struc_link_sub : source_cit_sub
2949 note_struc_emb_sect : OPEN DELIM TAG_NOTE opt_line_item
2951 = start_element(ELT_SUB_NOTE,
2953 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2954 START(NOTE, $<ctxt>$)
2959 { end_element(ELT_SUB_NOTE, PARENT, $<ctxt>5, NULL);
2963 note_struc_emb_subs : /* empty */
2964 | note_struc_emb_subs note_struc_emb_sub
2967 note_struc_emb_sub : continuation_sub
2972 /* PERSONAL NAME STRUCTURE */
2973 pers_name_struc_sub : pers_name_sect /* 0:M */
2976 pers_name_sect : OPEN DELIM TAG_NAME mand_line_item
2977 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME,
2979 GEDCOM_MAKE_STRING(val1, $4));
2980 START(NAME, $<ctxt>$)
2985 { end_element(ELT_SUB_PERS_NAME, PARENT, $<ctxt>5, NULL);
2989 pers_name_subs : /* empty */
2990 | pers_name_subs pers_name_sub
2993 pers_name_sub : pers_name_npfx_sect { OCCUR2(NPFX, 0, 1) }
2994 | pers_name_givn_sect { OCCUR2(GIVN, 0, 1) }
2995 | pers_name_nick_sect { OCCUR2(NICK, 0, 1) }
2996 | pers_name_spfx_sect { OCCUR2(SPFX, 0, 1) }
2997 | pers_name_surn_sect { OCCUR2(SURN, 0, 1) }
2998 | pers_name_nsfx_sect { OCCUR2(NSFX, 0, 1) }
3004 pers_name_npfx_sect : OPEN DELIM TAG_NPFX mand_line_item
3005 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NPFX,
3007 GEDCOM_MAKE_STRING(val1, $4));
3008 START(NPFX, $<ctxt>$)
3013 { end_element(ELT_SUB_PERS_NAME_NPFX, PARENT, $<ctxt>5,
3017 pers_name_givn_sect : OPEN DELIM TAG_GIVN mand_line_item
3018 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_GIVN,
3020 GEDCOM_MAKE_STRING(val1, $4));
3021 START(GIVN, $<ctxt>$)
3026 { end_element(ELT_SUB_PERS_NAME_GIVN, PARENT, $<ctxt>5,
3030 pers_name_nick_sect : OPEN DELIM TAG_NICK mand_line_item
3031 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NICK,
3033 GEDCOM_MAKE_STRING(val1, $4));
3034 START(NICK, $<ctxt>$)
3039 { end_element(ELT_SUB_PERS_NAME_NICK, PARENT, $<ctxt>5,
3043 pers_name_spfx_sect : OPEN DELIM TAG_SPFX mand_line_item
3044 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SPFX,
3046 GEDCOM_MAKE_STRING(val1, $4));
3047 START(SPFX, $<ctxt>$)
3052 { end_element(ELT_SUB_PERS_NAME_SPFX, PARENT, $<ctxt>5,
3056 pers_name_surn_sect : OPEN DELIM TAG_SURN mand_line_item
3057 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SURN,
3059 GEDCOM_MAKE_STRING(val1, $4));
3060 START(SURN, $<ctxt>$)
3065 { end_element(ELT_SUB_PERS_NAME_SURN, PARENT, $<ctxt>5,
3069 pers_name_nsfx_sect : OPEN DELIM TAG_NSFX mand_line_item
3070 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NSFX,
3072 GEDCOM_MAKE_STRING(val1, $4));
3073 START(NSFX, $<ctxt>$)
3078 { end_element(ELT_SUB_PERS_NAME_NSFX, PARENT, $<ctxt>5,
3083 /* PLACE STRUCTURE */
3084 place_struc_sub : place_struc_plac_sect /* 0:M */
3087 place_struc_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
3089 = start_element(ELT_SUB_PLAC,
3091 GEDCOM_MAKE_STRING(val1, $4));
3092 START(PLAC, $<ctxt>$)
3094 place_struc_plac_subs
3097 { end_element(ELT_SUB_PLAC, PARENT, $<ctxt>5, NULL);
3101 place_struc_plac_subs : /* empty */
3102 | place_struc_plac_subs place_struc_plac_sub
3105 place_struc_plac_sub : place_plac_form_sect { OCCUR2(FORM, 0, 1) }
3111 place_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
3113 = start_element(ELT_SUB_PLAC_FORM,
3115 GEDCOM_MAKE_STRING(val1, $4));
3116 START(FORM, $<ctxt>$)
3121 { end_element(ELT_SUB_PLAC_FORM, PARENT, $<ctxt>5,
3126 /* SOURCE_CITATION */
3127 source_cit_sub : source_cit_link_sect /* 0:M */
3128 | source_cit_emb_sect /* 0:M */
3131 source_cit_link_sect : OPEN DELIM TAG_SOUR DELIM POINTER
3132 { struct xref_value *xr = gedcom_parse_xref($5,
3135 if (xr == NULL) HANDLE_ERROR;
3137 = start_element(ELT_SUB_SOUR,
3139 GEDCOM_MAKE_XREF_PTR(val1, xr));
3140 START(SOUR, $<ctxt>$)
3142 source_cit_link_subs
3145 { end_element(ELT_SUB_SOUR, PARENT, $<ctxt>6, NULL);
3149 source_cit_link_subs : /* empty */
3150 | source_cit_link_subs source_cit_link_sub
3153 source_cit_link_sub : source_cit_page_sect { OCCUR2(PAGE, 0, 1) }
3154 | source_cit_even_sect { OCCUR2(EVEN, 0, 1) }
3155 | source_cit_data_sect { OCCUR2(DATA, 0, 1) }
3156 | source_cit_quay_sect { OCCUR2(QUAY, 0, 1) }
3162 source_cit_page_sect : OPEN DELIM TAG_PAGE mand_line_item
3164 = start_element(ELT_SUB_SOUR_PAGE,
3166 GEDCOM_MAKE_STRING(val1, $4));
3167 START(PAGE, $<ctxt>$)
3172 { end_element(ELT_SUB_SOUR_PAGE, PARENT, $<ctxt>5,
3177 source_cit_even_sect : OPEN DELIM TAG_EVEN mand_line_item
3179 = start_element(ELT_SUB_SOUR_EVEN,
3181 GEDCOM_MAKE_STRING(val1, $4));
3182 START(EVEN, $<ctxt>$)
3184 source_cit_even_subs
3187 { end_element(ELT_SUB_SOUR_EVEN, PARENT, $<ctxt>5,
3192 source_cit_even_subs : /* empty */
3193 | source_cit_even_subs source_cit_even_sub
3196 source_cit_even_sub : source_cit_even_role_sect { OCCUR2(ROLE, 0, 1) }
3200 source_cit_even_role_sect : OPEN DELIM TAG_ROLE mand_line_item
3202 = start_element(ELT_SUB_SOUR_EVEN_ROLE,
3204 GEDCOM_MAKE_STRING(val1, $4));
3205 START(ROLE, $<ctxt>$)
3210 { end_element(ELT_SUB_SOUR_EVEN_ROLE,
3211 PARENT, $<ctxt>5, NULL);
3215 source_cit_data_sect : OPEN DELIM TAG_DATA
3216 { $<ctxt>$ = start_element(ELT_SUB_SOUR_DATA,
3217 PARENT, $1, $3, NULL,
3218 GEDCOM_MAKE_NULL(val1));
3219 START(DATA, $<ctxt>$)
3221 source_cit_data_subs
3224 { end_element(ELT_SUB_SOUR_DATA, PARENT, $<ctxt>4,
3229 source_cit_data_subs : /* empty */
3230 | source_cit_data_subs source_cit_data_sub
3233 source_cit_data_sub : source_cit_data_date_sect { OCCUR2(DATE, 0, 1) }
3234 | source_cit_text_sect /* 0:M */
3238 source_cit_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
3239 { struct date_value dv = gedcom_parse_date($4);
3241 = start_element(ELT_SUB_SOUR_DATA_DATE,
3243 GEDCOM_MAKE_DATE(val1, dv));
3244 START(DATE, $<ctxt>$)
3249 { end_element(ELT_SUB_SOUR_DATA_DATE,
3250 PARENT, $<ctxt>5, NULL);
3254 source_cit_text_sect : OPEN DELIM TAG_TEXT mand_line_item
3256 = start_element(ELT_SUB_SOUR_TEXT,
3258 GEDCOM_MAKE_STRING(val1, $4));
3259 START(TEXT, $<ctxt>$)
3261 source_cit_text_subs
3264 { end_element(ELT_SUB_SOUR_TEXT, PARENT, $<ctxt>5,
3269 source_cit_text_subs : /* empty */
3270 | source_cit_text_subs source_cit_text_sub
3273 source_cit_text_sub : continuation_sub
3277 source_cit_quay_sect : OPEN DELIM TAG_QUAY mand_line_item
3279 = start_element(ELT_SUB_SOUR_QUAY,
3281 GEDCOM_MAKE_STRING(val1, $4));
3282 START(QUAY, $<ctxt>$)
3287 { end_element(ELT_SUB_SOUR_QUAY, PARENT, $<ctxt>5,
3292 source_cit_emb_sect : OPEN DELIM TAG_SOUR mand_line_item
3293 { $<ctxt>$ = start_element(ELT_SUB_SOUR,
3295 GEDCOM_MAKE_STRING(val1, $4));
3296 START(SOUR, $<ctxt>$)
3301 { end_element(ELT_SUB_SOUR, PARENT, $<ctxt>5, NULL);
3305 source_cit_emb_subs : /* empty */
3306 | source_cit_emb_subs source_cit_emb_sub
3309 source_cit_emb_sub : continuation_sub
3310 | source_cit_text_sect /* 0:M */
3315 /* SOURCE REPOSITORY CITATION */
3316 source_repos_cit_sub : source_repos_repo_sect { OCCUR2(REPO, 0, 1) }
3319 source_repos_repo_sect : OPEN DELIM TAG_REPO mand_pointer
3320 { struct xref_value *xr
3321 = gedcom_parse_xref($4, XREF_USED, XREF_REPO);
3322 if (xr == NULL) HANDLE_ERROR;
3324 = start_element(ELT_SUB_REPO,
3326 GEDCOM_MAKE_XREF_PTR(val1, xr));
3327 START(REPO, $<ctxt>$)
3329 source_repos_repo_subs
3332 { end_element(ELT_SUB_REPO, PARENT, $<ctxt>5, NULL);
3336 source_repos_repo_subs : /* empty */
3337 | source_repos_repo_subs source_repos_repo_sub
3340 source_repos_repo_sub : note_struc_sub
3341 | caln_sect /* 0:M */
3345 caln_sect : OPEN DELIM TAG_CALN mand_line_item
3346 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN,
3348 GEDCOM_MAKE_STRING(val1, $4));
3349 START(CALN, $<ctxt>$)
3354 { end_element(ELT_SUB_REPO_CALN, PARENT, $<ctxt>5, NULL);
3358 caln_subs : /* empty */
3359 | caln_subs caln_sub
3362 caln_sub : caln_medi_sect { OCCUR2(MEDI, 0, 1) }
3366 caln_medi_sect : OPEN DELIM TAG_MEDI mand_line_item
3367 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN_MEDI,
3369 GEDCOM_MAKE_STRING(val1, $4));
3370 START(MEDI, $<ctxt>$)
3375 { end_element(ELT_SUB_REPO_CALN_MEDI, PARENT, $<ctxt>5, NULL);
3379 /* SPOUSE TO FAMILY LINK */
3380 spou_fam_link_sub : spou_fam_fams_sect /* 0:M */
3383 spou_fam_fams_sect : OPEN DELIM TAG_FAMS mand_pointer
3384 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
3386 if (xr == NULL) HANDLE_ERROR;
3388 = start_element(ELT_SUB_FAMS,
3390 GEDCOM_MAKE_XREF_PTR(val1, xr));
3391 START(FAMS, $<ctxt>$)
3396 { end_element(ELT_SUB_FAMS, PARENT, $<ctxt>5, NULL);
3400 spou_fam_fams_subs : /* empty */
3401 | spou_fam_fams_subs spou_fam_fams_sub
3404 spou_fam_fams_sub : note_struc_sub
3408 /*********************************************************************/
3410 /*********************************************************************/
3412 no_std_subs : /* empty */
3413 | no_std_subs no_std_sub
3416 no_std_sub : user_sect /* 0:M */
3418 | error error_subs CLOSE { HANDLE_ERROR }
3421 no_std_rec : user_rec /* 0:M */
3423 | error error_subs CLOSE { HANDLE_ERROR }
3426 user_rec : OPEN DELIM opt_xref USERTAG
3427 { if ($4.string[0] != '_') {
3428 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3434 { struct xref_value *xr = NULL;
3436 xr = gedcom_parse_xref($3, XREF_DEFINED, XREF_USER);
3437 if (xr == NULL) HANDLE_ERROR;
3439 $<ctxt>$ = start_record(REC_USER,
3441 GEDCOM_MAKE_NULL_OR_XREF_PTR(val1, xr),
3448 { end_record(REC_USER, $<ctxt>7); }
3450 user_sect : OPEN DELIM opt_xref USERTAG
3451 { if ($4.string[0] != '_') {
3452 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3458 { $<ctxt>$ = start_element(ELT_USER, PARENT, $1, $4, $6, &val2);
3459 START($4, $<ctxt>$);
3464 { end_element(ELT_USER, PARENT, $<ctxt>7, NULL);
3468 user_sects : /* empty */ { }
3469 | user_sects user_sect { }
3472 opt_xref : /* empty */ { $$ = NULL; }
3473 | POINTER DELIM { $$ = $1; }
3476 opt_value : /* empty */ { GEDCOM_MAKE_NULL(val2);
3478 | DELIM POINTER { struct xref_value *xr
3479 = gedcom_parse_xref($2, XREF_USED,
3481 GEDCOM_MAKE_XREF_PTR(val2, xr);
3483 | DELIM line_item { GEDCOM_MAKE_STRING(val2, $2);
3487 mand_pointer : /* empty */ { gedcom_error(_("Missing pointer")); YYERROR; }
3488 | DELIM POINTER { gedcom_debug_print("==Ptr: %s==", $2);
3492 mand_line_item : /* empty */ { gedcom_error(_("Missing value")); YYERROR; }
3493 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3497 opt_line_item : /* empty */ { }
3498 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3502 line_item : anychar { size_t i;
3503 CLEAR_BUFFER(line_item_buf);
3504 line_item_buf_ptr = line_item_buf;
3505 /* The following also takes care of '@@' */
3506 if (!strncmp($1, "@@", 3))
3507 *line_item_buf_ptr++ = '@';
3509 for (i=0; i < strlen($1); i++)
3510 *line_item_buf_ptr++ = $1[i];
3513 | ESCAPE { size_t i;
3514 CLEAR_BUFFER(line_item_buf);
3515 line_item_buf_ptr = line_item_buf;
3516 for (i=0; i < strlen($1); i++)
3517 *line_item_buf_ptr++ = $1[i];
3522 /* The following also takes care of '@@' */
3523 if (!strncmp($2, "@@", 3))
3524 *line_item_buf_ptr++ = '@';
3526 for (i=0; i < strlen($2); i++)
3527 *line_item_buf_ptr++ = $2[i];
3532 for (i=0; i < strlen($2); i++)
3533 *line_item_buf_ptr++ = $2[i];
3538 anychar : ANYCHAR { }
3542 error_subs : /* empty */
3543 | error_subs error_sect
3546 error_sect : OPEN DELIM opt_xref anytag opt_value error_subs CLOSE { }
3548 gen_sect : OPEN DELIM opt_xref anystdtag
3549 { INVALID_TAG($4); }
3550 opt_value opt_sects CLOSE
3554 gen_rec : gen_rec_top
3558 gen_rec_norm : OPEN DELIM opt_xref anystdtag
3559 { INVALID_TOP_TAG($4) }
3560 opt_value opt_sects CLOSE
3564 gen_rec_top : OPEN DELIM anytoptag
3565 { gedcom_error(_("Missing cross-reference")); YYERROR; }
3566 opt_value opt_sects CLOSE
3570 opt_sects : /* empty */ { }
3571 | opt_sects gen_sect { }
3574 anytag : USERTAG { }
3588 anystdtag : TAG_ABBR
3718 /* Functions that handle the counting of subtags */
3720 int* count_arrays[MAXGEDCLEVEL+1];
3721 char tag_stack[MAXGEDCLEVEL+1][MAXSTDTAGLEN+1];
3722 Gedcom_ctxt ctxt_stack[MAXGEDCLEVEL+1];
3724 void push_countarray()
3727 if (count_level > MAXGEDCLEVEL) {
3728 gedcom_error(_("Internal error: count array overflow"));
3732 count = (int *)calloc(YYNTOKENS, sizeof(int));
3733 if (count == NULL) {
3734 gedcom_error(_("Internal error: count array calloc error"));
3738 count_arrays[count_level] = count;
3743 void set_parenttag(char* tag)
3745 strncpy(tag_stack[count_level+1], tag, MAXSTDTAGLEN+1);
3748 void set_parentctxt(Gedcom_ctxt ctxt)
3750 ctxt_stack[count_level+1] = ctxt;
3753 char* get_parenttag()
3755 return tag_stack[count_level];
3758 Gedcom_ctxt get_parentctxt()
3760 return ctxt_stack[count_level];
3763 int count_tag(int tag)
3765 int *count = count_arrays[count_level];
3766 return ++count[tag - GEDCOMTAGOFFSET];
3769 int check_occurrence(int tag)
3771 int *count = count_arrays[count_level];
3772 return (count[tag - GEDCOMTAGOFFSET] > 0);
3775 void pop_countarray()
3778 if (count_level < 0) {
3779 gedcom_error(_("Internal error: count array underflow"));
3783 count = count_arrays[count_level];
3785 count_arrays[count_level] = NULL;
3789 /* Enabling debug mode */
3790 /* level 0: no debugging */
3791 /* level 1: only internal */
3792 /* level 2: also bison */
3795 void gedcom_set_debug_level(int level, FILE* f)
3800 trace_output = stderr;
3802 gedcom_high_level_debug = 1;
3811 int gedcom_debug_print(char* s, ...)
3814 if (gedcom_high_level_debug) {
3817 res = vfprintf(trace_output, s, ap);
3819 fprintf(trace_output, "\n");
3824 /* Setting the error mechanism */
3825 void gedcom_set_error_handling(Gedcom_err_mech mechanism)
3827 error_mechanism = mechanism;
3830 /* Compatibility handling */
3832 void gedcom_set_compat_handling(int enable_compat)
3834 compat_enabled = enable_compat;
3837 void set_compatibility(char* program)
3839 if (compat_enabled) {
3840 if (! strncmp(program, "ftree", 6)) {
3841 gedcom_warning(_("Enabling compatibility with 'ftree'"));
3842 compatibility = C_FTREE;
3850 int compat_mode(int compat_flags)
3852 return (compat_flags & compatibility);