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"
154 int compat_enabled = 1;
155 int gedcom_high_level_debug = 0;
156 int compatibility = 0;
157 Gedcom_err_mech error_mechanism = IMMED_FAIL;
158 Gedcom_val_struct val1;
159 Gedcom_val_struct val2;
161 char line_item_buf[MAXGEDCLINELEN * UTF_FACTOR + 1];
162 char *line_item_buf_ptr;
169 /* These are defined at the bottom of the file */
170 void push_countarray();
171 void set_parenttag(char* tag);
172 char* get_parenttag(int offset);
173 void set_parentctxt(Gedcom_ctxt ctxt);
174 Gedcom_ctxt get_parentctxt(int offset);
175 void pop_countarray();
176 int count_tag(int tag);
177 int check_occurrence(int tag);
178 void set_compatibility(char* program);
179 int compat_mode(int flags);
181 #define CLEAR_BUFFER(BUF) \
182 memset(BUF, 0, sizeof(BUF));
184 #define HANDLE_ERROR \
185 { if (error_mechanism == IMMED_FAIL) { \
188 else if (error_mechanism == DEFER_FAIL) { \
191 else if (error_mechanism == IGNORE_ERRORS) { \
195 #define START1(PARENTTAG) \
196 { set_parenttag(#PARENTTAG); \
198 #define START2(PARENTCTXT) \
199 { set_parentctxt(PARENTCTXT); \
203 #define START(PARENTTAG,PARENTCTXT) \
204 { START1(PARENTTAG); \
205 START2(PARENTCTXT); \
209 #define GRANDPARENT(OFF) \
212 { if (!check_occurrence(TAG_##TAG)) { \
213 char* parenttag = get_parenttag(0); \
214 gedcom_error(_("The tag '%s' is mandatory within '%s', but missing"),\
220 { pop_countarray(); \
224 #define CHECK1(TAG1) { CHK(TAG1); POP; }
225 #define CHECK2(TAG1,TAG2) \
226 { CHK(TAG1); CHK(TAG2); POP; }
227 #define CHECK3(TAG1,TAG2,TAG3) \
228 { CHK(TAG1); CHK(TAG2); CHK(TAG3); POP; }
229 #define CHECK4(TAG1,TAG2,TAG3,TAG4) \
230 { CHK(TAG1); CHK(TAG2); CHK(TAG3); CHK(TAG4); POP; }
231 #define OCCUR1(CHILDTAG, MIN) { count_tag(TAG_##CHILDTAG); }
232 #define OCCUR2(CHILDTAG, MIN, MAX) \
233 { int num = count_tag(TAG_##CHILDTAG); \
235 char* parenttag = get_parenttag(0); \
236 gedcom_error(_("The tag '%s' can maximally occur %d time(s) within '%s'"), \
237 #CHILDTAG, MAX, parenttag); \
241 #define INVALID_TAG(CHILDTAG) \
242 { char* parenttag = get_parenttag(0); \
243 gedcom_error(_("The tag '%s' is not a valid tag within '%s'"), \
244 CHILDTAG, parenttag); \
247 #define INVALID_TOP_TAG(CHILDTAG) \
248 { gedcom_error(_("The tag '%s' is not a valid top-level tag"), \
258 struct tag_struct tag;
265 %token <string> BADTOKEN
267 %token <string> CLOSE
268 %token <string> ESCAPE
269 %token <string> DELIM
270 %token <string> ANYCHAR
271 %token <string> POINTER
273 %token <tag> TAG_ABBR
274 %token <tag> TAG_ADDR
275 %token <tag> TAG_ADR1
276 %token <tag> TAG_ADR2
277 %token <tag> TAG_ADOP
280 %token <tag> TAG_AGNC
281 %token <tag> TAG_ALIA
282 %token <tag> TAG_ANCE
283 %token <tag> TAG_ANCI
284 %token <tag> TAG_ANUL
285 %token <tag> TAG_ASSO
286 %token <tag> TAG_AUTH
287 %token <tag> TAG_BAPL
288 %token <tag> TAG_BAPM
289 %token <tag> TAG_BARM
290 %token <tag> TAG_BASM
291 %token <tag> TAG_BIRT
292 %token <tag> TAG_BLES
293 %token <tag> TAG_BLOB
294 %token <tag> TAG_BURI
295 %token <tag> TAG_CALN
296 %token <tag> TAG_CAST
297 %token <tag> TAG_CAUS
298 %token <tag> TAG_CENS
299 %token <tag> TAG_CHAN
300 %token <tag> TAG_CHAR
301 %token <tag> TAG_CHIL
303 %token <tag> TAG_CHRA
304 %token <tag> TAG_CITY
305 %token <tag> TAG_CONC
306 %token <tag> TAG_CONF
307 %token <tag> TAG_CONL
308 %token <tag> TAG_CONT
309 %token <tag> TAG_COPR
310 %token <tag> TAG_CORP
311 %token <tag> TAG_CREM
312 %token <tag> TAG_CTRY
313 %token <tag> TAG_DATA
314 %token <tag> TAG_DATE
315 %token <tag> TAG_DEAT
316 %token <tag> TAG_DESC
317 %token <tag> TAG_DESI
318 %token <tag> TAG_DEST
320 %token <tag> TAG_DIVF
321 %token <tag> TAG_DSCR
322 %token <tag> TAG_EDUC
323 %token <tag> TAG_EMIG
324 %token <tag> TAG_ENDL
325 %token <tag> TAG_ENGA
326 %token <tag> TAG_EVEN
328 %token <tag> TAG_FAMC
329 %token <tag> TAG_FAMF
330 %token <tag> TAG_FAMS
331 %token <tag> TAG_FCOM
332 %token <tag> TAG_FILE
333 %token <tag> TAG_FORM
334 %token <tag> TAG_GEDC
335 %token <tag> TAG_GIVN
336 %token <tag> TAG_GRAD
337 %token <tag> TAG_HEAD
338 %token <tag> TAG_HUSB
339 %token <tag> TAG_IDNO
340 %token <tag> TAG_IMMI
341 %token <tag> TAG_INDI
342 %token <tag> TAG_LANG
343 %token <tag> TAG_LEGA
344 %token <tag> TAG_MARB
345 %token <tag> TAG_MARC
346 %token <tag> TAG_MARL
347 %token <tag> TAG_MARR
348 %token <tag> TAG_MARS
349 %token <tag> TAG_MEDI
350 %token <tag> TAG_NAME
351 %token <tag> TAG_NATI
352 %token <tag> TAG_NATU
353 %token <tag> TAG_NCHI
354 %token <tag> TAG_NICK
356 %token <tag> TAG_NOTE
357 %token <tag> TAG_NPFX
358 %token <tag> TAG_NSFX
359 %token <tag> TAG_OBJE
360 %token <tag> TAG_OCCU
361 %token <tag> TAG_ORDI
362 %token <tag> TAG_ORDN
363 %token <tag> TAG_PAGE
364 %token <tag> TAG_PEDI
365 %token <tag> TAG_PHON
366 %token <tag> TAG_PLAC
367 %token <tag> TAG_POST
368 %token <tag> TAG_PROB
369 %token <tag> TAG_PROP
370 %token <tag> TAG_PUBL
371 %token <tag> TAG_QUAY
372 %token <tag> TAG_REFN
373 %token <tag> TAG_RELA
374 %token <tag> TAG_RELI
375 %token <tag> TAG_REPO
376 %token <tag> TAG_RESI
377 %token <tag> TAG_RESN
378 %token <tag> TAG_RETI
381 %token <tag> TAG_ROLE
383 %token <tag> TAG_SLGC
384 %token <tag> TAG_SLGS
385 %token <tag> TAG_SOUR
386 %token <tag> TAG_SPFX
388 %token <tag> TAG_STAE
389 %token <tag> TAG_STAT
390 %token <tag> TAG_SUBM
391 %token <tag> TAG_SUBN
392 %token <tag> TAG_SURN
393 %token <tag> TAG_TEMP
394 %token <tag> TAG_TEXT
395 %token <tag> TAG_TIME
396 %token <tag> TAG_TITL
397 %token <tag> TAG_TRLR
398 %token <tag> TAG_TYPE
399 %token <tag> TAG_VERS
400 %token <tag> TAG_WIFE
401 %token <tag> TAG_WILL
403 %type <tag> anystdtag
404 %type <tag> anytoptag
405 %type <tag> fam_event_tag
406 %type <tag> indiv_attr_tag
407 %type <tag> indiv_birt_tag
408 %type <tag> indiv_gen_tag
409 %type <tag> lio_bapl_tag
410 %type <string> line_item
411 %type <string> mand_line_item
412 %type <string> mand_pointer
413 %type <string> note_line_item
414 %type <string> anychar
415 %type <string> opt_xref
416 %type <string> opt_value
417 %type <string> opt_line_item
418 %type <ctxt> head_sect
422 file : head_sect records trlr_sect
423 { if (fail == 1) YYABORT; }
428 records : /* empty */
443 /*********************************************************************/
445 /*********************************************************************/
446 head_sect : OPEN DELIM TAG_HEAD
447 { $<ctxt>$ = start_record(REC_HEAD, $1, GEDCOM_MAKE_NULL(val1),
449 NULL, GEDCOM_MAKE_NULL(val2));
450 START(HEAD, $<ctxt>$) }
452 { if (compat_mode(C_FTREE)) {
453 CHECK3(SOUR, GEDC, CHAR);
454 compat_generate_submitter_link($<ctxt>4);
456 else if (compat_mode(C_LIFELINES)) {
458 compat_generate_submitter_link($<ctxt>4);
459 compat_generate_gedcom($<ctxt>4);
460 if (compat_generate_char($<ctxt>4)) YYABORT;
463 CHECK4(SOUR, SUBM, GEDC, CHAR)
466 { end_record(REC_HEAD, $<ctxt>4);
467 if (compat_mode(C_FTREE | C_LIFELINES))
468 compat_generate_submitter();
472 head_subs : /* empty */
476 head_sub : head_sour_sect { OCCUR2(SOUR, 1, 1) }
477 | head_dest_sect { OCCUR2(DEST, 0, 1) }
478 | head_date_sect { OCCUR2(DATE, 0, 1) }
479 | head_time_sect { if (!compat_mode(C_LIFELINES))
482 | head_subm_sect { OCCUR2(SUBM, 1, 1) }
483 | head_subn_sect { OCCUR2(SUBN, 0, 1) }
484 | head_file_sect { OCCUR2(FILE, 0, 1) }
485 | head_copr_sect { OCCUR2(COPR, 0, 1) }
486 | head_gedc_sect { OCCUR2(GEDC, 1, 1) }
487 | head_char_sect { OCCUR2(CHAR, 1, 1) }
488 | head_lang_sect { OCCUR2(LANG, 0, 1) }
489 | head_plac_sect { OCCUR2(PLAC, 0, 1) }
490 | head_note_sect { OCCUR2(NOTE, 0, 1) }
495 head_sour_sect : OPEN DELIM TAG_SOUR mand_line_item
496 { set_compatibility($4);
497 $<ctxt>$ = start_element(ELT_HEAD_SOUR, PARENT,
499 GEDCOM_MAKE_STRING(val1, $4));
500 START(SOUR, $<ctxt>$)
505 { end_element(ELT_HEAD_SOUR, PARENT, $<ctxt>5, NULL); }
508 head_sour_subs : /* empty */
509 | head_sour_subs head_sour_sub
512 head_sour_sub : head_sour_vers_sect { OCCUR2(VERS, 0, 1) }
513 | head_sour_name_sect { OCCUR2(NAME, 0, 1) }
514 | head_sour_corp_sect { OCCUR2(CORP, 0, 1) }
515 | head_sour_data_sect { OCCUR2(DATA, 0, 1) }
519 head_sour_vers_sect : OPEN DELIM TAG_VERS mand_line_item
520 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_VERS, PARENT,
522 GEDCOM_MAKE_STRING(val1, $4));
523 START(VERS, $<ctxt>$)
528 { end_element(ELT_HEAD_SOUR_VERS,
529 PARENT, $<ctxt>5, NULL);
532 head_sour_name_sect : OPEN DELIM TAG_NAME mand_line_item
533 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_NAME, PARENT,
535 GEDCOM_MAKE_STRING(val1, $4));
536 START(NAME, $<ctxt>$)
541 { end_element(ELT_HEAD_SOUR_NAME,
542 PARENT, $<ctxt>5, NULL);
545 head_sour_corp_sect : OPEN DELIM TAG_CORP mand_line_item
546 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_CORP, PARENT,
548 GEDCOM_MAKE_STRING(val1, $4));
549 START(CORP, $<ctxt>$)
554 { end_element(ELT_HEAD_SOUR_CORP,
555 PARENT, $<ctxt>5, NULL);
559 head_sour_corp_subs : /* empty */
560 | head_sour_corp_subs head_sour_corp_sub
563 head_sour_corp_sub : addr_struc_sub /* 0:1 */
567 head_sour_data_sect : OPEN DELIM TAG_DATA mand_line_item
568 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_DATA, PARENT,
570 GEDCOM_MAKE_STRING(val1, $4));
571 START(DATA, $<ctxt>$)
576 { end_element(ELT_HEAD_SOUR_DATA,
577 PARENT, $<ctxt>5, NULL);
581 head_sour_data_subs : /* empty */
582 | head_sour_data_subs head_sour_data_sub
585 head_sour_data_sub : head_sour_data_date_sect { OCCUR2(DATE, 0, 1) }
586 | head_sour_data_copr_sect { OCCUR2(COPR, 0, 1) }
590 head_sour_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
591 { struct date_value dv = gedcom_parse_date($4);
593 = start_element(ELT_HEAD_SOUR_DATA_DATE,
595 GEDCOM_MAKE_DATE(val1, dv));
596 START(DATE, $<ctxt>$)
601 { end_element(ELT_HEAD_SOUR_DATA_DATE,
602 PARENT, $<ctxt>5, NULL);
605 head_sour_data_copr_sect : OPEN DELIM TAG_COPR mand_line_item
607 = start_element(ELT_HEAD_SOUR_DATA_COPR,
609 GEDCOM_MAKE_STRING(val1, $4));
610 START(COPR, $<ctxt>$)
615 { end_element(ELT_HEAD_SOUR_DATA_COPR,
616 PARENT, $<ctxt>5, NULL);
621 head_dest_sect : OPEN DELIM TAG_DEST mand_line_item
622 { $<ctxt>$ = start_element(ELT_HEAD_DEST,
624 GEDCOM_MAKE_STRING(val1, $4));
625 START(DEST, $<ctxt>$)
630 { end_element(ELT_HEAD_DEST,
631 PARENT, $<ctxt>5, NULL);
636 head_date_sect : OPEN DELIM TAG_DATE mand_line_item
637 { struct date_value dv = gedcom_parse_date($4);
638 $<ctxt>$ = start_element(ELT_HEAD_DATE,
640 GEDCOM_MAKE_DATE(val1, dv));
641 START(DATE, $<ctxt>$)
646 { end_element(ELT_HEAD_DATE,
647 PARENT, $<ctxt>5, NULL);
651 head_date_subs : /* empty */
652 | head_date_subs head_date_sub
655 head_date_sub : head_date_time_sect { OCCUR2(TIME, 0, 1) }
659 head_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
660 { $<ctxt>$ = start_element(ELT_HEAD_DATE_TIME,
662 GEDCOM_MAKE_STRING(val1, $4));
663 START(TIME, $<ctxt>$)
668 { end_element(ELT_HEAD_DATE_TIME,
669 PARENT, $<ctxt>5, NULL);
673 /* HEAD.TIME (Only for 'Lifelines' compatibility) */
674 /* Just ignore the time... */
675 head_time_sect : OPEN DELIM TAG_TIME opt_line_item
681 head_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
682 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
684 if (xr == NULL) HANDLE_ERROR;
685 $<ctxt>$ = start_element(ELT_HEAD_SUBM,
687 GEDCOM_MAKE_XREF_PTR(val1, xr));
688 START(SUBM, $<ctxt>$)
693 { end_element(ELT_HEAD_SUBM,
694 PARENT, $<ctxt>5, NULL);
698 head_subn_sect : OPEN DELIM TAG_SUBN mand_pointer
699 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
701 if (xr == NULL) HANDLE_ERROR;
702 $<ctxt>$ = start_element(ELT_HEAD_SUBN,
704 GEDCOM_MAKE_XREF_PTR(val1, xr));
705 START(SUBN, $<ctxt>$)
710 { end_element(ELT_HEAD_SUBN,
711 PARENT, $<ctxt>5, NULL);
715 head_file_sect : OPEN DELIM TAG_FILE mand_line_item
716 { $<ctxt>$ = start_element(ELT_HEAD_FILE,
718 GEDCOM_MAKE_STRING(val1, $4));
719 START(FILE, $<ctxt>$)
724 { end_element(ELT_HEAD_FILE, PARENT, $<ctxt>5, NULL);
728 head_copr_sect : OPEN DELIM TAG_COPR mand_line_item
729 { $<ctxt>$ = start_element(ELT_HEAD_COPR,
731 GEDCOM_MAKE_STRING(val1, $4));
732 START(COPR, $<ctxt>$)
737 { end_element(ELT_HEAD_COPR, PARENT, $<ctxt>5, NULL);
741 head_gedc_sect : OPEN DELIM TAG_GEDC
742 { $<ctxt>$ = start_element(ELT_HEAD_GEDC,
743 PARENT, $1, $3, NULL,
744 GEDCOM_MAKE_NULL(val1));
745 START(GEDC, $<ctxt>$)
748 { CHECK2(VERS, FORM) }
750 { end_element(ELT_HEAD_GEDC, PARENT, $<ctxt>4, NULL);
754 head_gedc_subs : /* empty */
755 | head_gedc_subs head_gedc_sub
758 head_gedc_sub : head_gedc_vers_sect { OCCUR2(VERS, 1, 1) }
759 | head_gedc_form_sect { OCCUR2(FORM, 1, 1) }
762 head_gedc_vers_sect : OPEN DELIM TAG_VERS mand_line_item
763 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_VERS,
765 GEDCOM_MAKE_STRING(val1, $4));
766 START(VERS, $<ctxt>$)
771 { end_element(ELT_HEAD_GEDC_VERS,
772 PARENT, $<ctxt>5, NULL);
775 head_gedc_form_sect : OPEN DELIM TAG_FORM mand_line_item
776 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_FORM,
778 GEDCOM_MAKE_STRING(val1, $4));
779 START(FORM, $<ctxt>$)
784 { end_element(ELT_HEAD_GEDC_FORM,
785 PARENT, $<ctxt>5, NULL);
790 head_char_sect : OPEN DELIM TAG_CHAR mand_line_item
791 { /* Don't allow to continue if conversion context couldn't
793 if (open_conv_to_internal($4) == 0) YYABORT;
794 $<ctxt>$ = start_element(ELT_HEAD_CHAR,
796 GEDCOM_MAKE_STRING(val1, $4));
797 START(CHAR, $<ctxt>$)
802 { end_element(ELT_HEAD_CHAR, PARENT, $<ctxt>5, NULL);
806 head_char_subs : /* empty */
807 | head_char_subs head_char_sub
810 head_char_sub : head_char_vers_sect { OCCUR2(VERS, 0, 1) }
813 head_char_vers_sect : OPEN DELIM TAG_VERS mand_line_item
814 { $<ctxt>$ = start_element(ELT_HEAD_CHAR_VERS,
816 GEDCOM_MAKE_STRING(val1, $4));
817 START(VERS, $<ctxt>$)
822 { end_element(ELT_HEAD_CHAR_VERS,
823 PARENT, $<ctxt>5, NULL);
828 head_lang_sect : OPEN DELIM TAG_LANG mand_line_item
829 { $<ctxt>$ = start_element(ELT_HEAD_LANG,
831 GEDCOM_MAKE_STRING(val1, $4));
832 START(LANG, $<ctxt>$)
837 { end_element(ELT_HEAD_LANG, PARENT, $<ctxt>5, NULL);
841 head_plac_sect : OPEN DELIM TAG_PLAC
842 { $<ctxt>$ = start_element(ELT_HEAD_PLAC,
843 PARENT, $1, $3, NULL,
844 GEDCOM_MAKE_NULL(val1));
845 START(PLAC, $<ctxt>$)
850 { end_element(ELT_HEAD_PLAC, PARENT, $<ctxt>4, NULL);
854 head_plac_subs : /* empty */
855 | head_plac_subs head_plac_sub
858 head_plac_sub : head_plac_form_sect { OCCUR2(FORM, 1, 1) }
861 head_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
862 { $<ctxt>$ = start_element(ELT_HEAD_PLAC_FORM,
864 GEDCOM_MAKE_STRING(val1, $4));
865 START(FORM, $<ctxt>$)
870 { end_element(ELT_HEAD_PLAC_FORM,
871 PARENT, $<ctxt>5, NULL);
876 head_note_sect : OPEN DELIM TAG_NOTE mand_line_item
877 { $<ctxt>$ = start_element(ELT_HEAD_NOTE,
879 GEDCOM_MAKE_STRING(val1, $4));
880 START(NOTE, $<ctxt>$)
885 { end_element(ELT_HEAD_NOTE, PARENT, $<ctxt>5, NULL);
889 head_note_subs : /* empty */
890 | head_note_subs head_note_sub
893 head_note_sub : continuation_sub /* 0:M */
897 /*********************************************************************/
899 /*********************************************************************/
900 /* Don't need callbacks here, there is no information... */
901 trlr_sect : OPEN DELIM TAG_TRLR CLOSE { }
904 /*********************************************************************/
905 /**** Family record ****/
906 /*********************************************************************/
907 fam_rec : OPEN DELIM POINTER DELIM TAG_FAM
908 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
910 if (xr == NULL) HANDLE_ERROR;
911 $<ctxt>$ = start_record(REC_FAM,
912 $1, GEDCOM_MAKE_XREF_PTR(val1, xr),
914 NULL, GEDCOM_MAKE_NULL(val2));
915 START(FAM, $<ctxt>$) }
919 { end_record(REC_FAM, $<ctxt>6); }
922 fam_subs : /* empty */
926 fam_sub : fam_event_struc_sub /* 0:M */
927 | fam_husb_sect { OCCUR2(HUSB, 0, 1) }
928 | fam_wife_sect { OCCUR2(WIFE, 0, 1) }
929 | fam_chil_sect /* 0:M */
930 | fam_nchi_sect { OCCUR2(NCHI, 0, 1) }
931 | fam_subm_sect /* 0:M */
932 | lds_spouse_seal_sub /* 0:M */
933 | source_cit_sub /* 0:M */
934 | multim_link_sub /* 0:M */
935 | note_struc_sub /* 0:M */
936 | ident_struc_sub /* 0:1 */
937 | change_date_sub /* 0:1 */
942 fam_husb_sect : OPEN DELIM TAG_HUSB mand_pointer
943 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
945 if (xr == NULL) HANDLE_ERROR;
946 $<ctxt>$ = start_element(ELT_FAM_HUSB,
948 GEDCOM_MAKE_XREF_PTR(val1, xr));
949 START(HUSB, $<ctxt>$)
954 { end_element(ELT_FAM_HUSB, PARENT, $<ctxt>5, NULL);
959 fam_wife_sect : OPEN DELIM TAG_WIFE mand_pointer
960 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
962 if (xr == NULL) HANDLE_ERROR;
963 $<ctxt>$ = start_element(ELT_FAM_WIFE,
965 GEDCOM_MAKE_XREF_PTR(val1, xr));
966 START(WIFE, $<ctxt>$)
971 { end_element(ELT_FAM_WIFE, PARENT, $<ctxt>5, NULL);
976 fam_chil_sect : OPEN DELIM TAG_CHIL mand_pointer
977 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
979 if (xr == NULL) HANDLE_ERROR;
980 $<ctxt>$ = start_element(ELT_FAM_CHIL,
982 GEDCOM_MAKE_XREF_PTR(val1, xr));
983 START(CHIL, $<ctxt>$)
988 { end_element(ELT_FAM_CHIL, PARENT, $<ctxt>5, NULL);
993 fam_nchi_sect : OPEN DELIM TAG_NCHI mand_line_item
994 { $<ctxt>$ = start_element(ELT_FAM_NCHI,
996 GEDCOM_MAKE_STRING(val1, $4));
997 START(NCHI, $<ctxt>$)
1002 { end_element(ELT_FAM_NCHI, PARENT, $<ctxt>5, NULL);
1007 fam_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1008 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1010 if (xr == NULL) HANDLE_ERROR;
1011 $<ctxt>$ = start_element(ELT_FAM_SUBM,
1013 GEDCOM_MAKE_XREF_PTR(val1, xr));
1014 START(SUBM, $<ctxt>$)
1019 { end_element(ELT_FAM_SUBM, PARENT, $<ctxt>5, NULL);
1023 /*********************************************************************/
1024 /**** Individual record ****/
1025 /*********************************************************************/
1026 indiv_rec : OPEN DELIM POINTER DELIM TAG_INDI
1027 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1029 if (xr == NULL) HANDLE_ERROR;
1030 $<ctxt>$ = start_record(REC_INDI,
1031 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1032 NULL, GEDCOM_MAKE_NULL(val2));
1033 START(INDI, $<ctxt>$) }
1037 { end_record(REC_INDI, $<ctxt>6); }
1040 indi_subs : /* empty */
1041 | indi_subs indi_sub
1044 indi_sub : indi_resn_sect { OCCUR2(RESN, 0, 1) }
1045 | pers_name_struc_sub /* 0:M */
1046 | indi_sex_sect { OCCUR2(SEX, 0, 1) }
1047 | indiv_even_struc_sub /* 0:M */
1048 | indiv_attr_struc_sub /* 0:M */
1049 | lds_indiv_ord_sub /* 0:M */
1050 | chi_fam_link_sub /* 0:M */
1051 | spou_fam_link_sub /* 0:M */
1052 | indi_subm_sect /* 0:M */
1053 | assoc_struc_sub /* 0:M */
1054 | indi_alia_sect /* 0:M */
1055 | indi_anci_sect /* 0:M */
1056 | indi_desi_sect /* 0:M */
1057 | source_cit_sub /* 0:M */
1058 | multim_link_sub /* 0:M */
1059 | note_struc_sub /* 0:M */
1060 | indi_rfn_sect { OCCUR2(RFN, 0, 1) }
1061 | indi_afn_sect /* 0:M */
1062 | ident_struc_sub /* 0:1 */
1063 | change_date_sub /* 0:1 */
1064 | ftree_addr_sect { if (!compat_mode(C_FTREE))
1065 INVALID_TAG("ADDR");
1071 indi_resn_sect : OPEN DELIM TAG_RESN mand_line_item
1072 { $<ctxt>$ = start_element(ELT_INDI_RESN,
1074 GEDCOM_MAKE_STRING(val1, $4));
1075 START(RESN, $<ctxt>$)
1080 { end_element(ELT_INDI_RESN, PARENT, $<ctxt>5, NULL);
1085 indi_sex_sect : OPEN DELIM TAG_SEX mand_line_item
1086 { $<ctxt>$ = start_element(ELT_INDI_SEX,
1088 GEDCOM_MAKE_STRING(val1, $4));
1089 START(SEX, $<ctxt>$)
1094 { end_element(ELT_INDI_SEX, PARENT, $<ctxt>5, NULL);
1099 indi_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1100 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1102 if (xr == NULL) HANDLE_ERROR;
1103 $<ctxt>$ = start_element(ELT_INDI_SUBM,
1105 GEDCOM_MAKE_XREF_PTR(val1, xr));
1106 START(SUBM, $<ctxt>$)
1111 { end_element(ELT_INDI_SUBM, PARENT, $<ctxt>5, NULL);
1116 indi_alia_sect : OPEN DELIM TAG_ALIA mand_pointer
1117 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1119 if (xr == NULL) HANDLE_ERROR;
1120 $<ctxt>$ = start_element(ELT_INDI_ALIA,
1122 GEDCOM_MAKE_XREF_PTR(val1, xr));
1123 START(ALIA, $<ctxt>$)
1128 { end_element(ELT_INDI_ALIA, PARENT, $<ctxt>5, NULL);
1133 indi_anci_sect : OPEN DELIM TAG_ANCI mand_pointer
1134 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1136 if (xr == NULL) HANDLE_ERROR;
1137 $<ctxt>$ = start_element(ELT_INDI_ANCI,
1139 GEDCOM_MAKE_XREF_PTR(val1, xr));
1140 START(ANCI, $<ctxt>$)
1145 { end_element(ELT_INDI_ANCI, PARENT, $<ctxt>5, NULL);
1150 indi_desi_sect : OPEN DELIM TAG_DESI mand_pointer
1151 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1153 if (xr == NULL) HANDLE_ERROR;
1154 $<ctxt>$ = start_element(ELT_INDI_DESI,
1156 GEDCOM_MAKE_XREF_PTR(val1, xr));
1157 START(DESI, $<ctxt>$)
1162 { end_element(ELT_INDI_DESI, PARENT, $<ctxt>5, NULL);
1167 indi_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1168 { $<ctxt>$ = start_element(ELT_INDI_RFN,
1170 GEDCOM_MAKE_STRING(val1, $4));
1171 START(RFN, $<ctxt>$)
1176 { end_element(ELT_INDI_RFN, PARENT, $<ctxt>5, NULL);
1181 indi_afn_sect : OPEN DELIM TAG_AFN mand_line_item
1182 { $<ctxt>$ = start_element(ELT_INDI_AFN,
1184 GEDCOM_MAKE_STRING(val1, $4));
1185 START(AFN, $<ctxt>$)
1190 { end_element(ELT_INDI_AFN, PARENT, $<ctxt>5, NULL);
1194 /* INDI.ADDR (Only for 'ftree' compatibility) */
1195 ftree_addr_sect : OPEN DELIM TAG_ADDR opt_line_item
1196 { if (compat_mode(C_FTREE)) {
1197 Gedcom_ctxt par = compat_generate_resi_start(PARENT);
1200 = start_element(ELT_SUB_ADDR,
1201 par, $1 + 1, $3, $4,
1202 GEDCOM_MAKE_NULL_OR_STRING(val2, $4));
1203 START(ADDR, $<ctxt>$);
1205 else { START(ADDR, NULL) }
1210 { if (compat_mode(C_FTREE)) {
1211 Gedcom_ctxt par = PARENT;
1212 end_element(ELT_SUB_ADDR, par, $<ctxt>5, NULL);
1214 compat_generate_resi_end(PARENT, par);
1218 ftree_addr_subs : /* empty */
1219 | ftree_addr_subs ftree_addr_sub
1222 ftree_addr_sub : continuation_sub
1223 | ftree_addr_phon_sect
1227 ftree_addr_phon_sect : OPEN DELIM TAG_PHON mand_line_item
1229 = start_element(ELT_SUB_PHON,
1230 GRANDPARENT(1), $1, $3, $4,
1231 GEDCOM_MAKE_STRING(val1, $4));
1232 START(PHON, $<ctxt>$)
1237 { end_element(ELT_SUB_PHON, GRANDPARENT(1),
1242 /*********************************************************************/
1243 /**** Multimedia record ****/
1244 /*********************************************************************/
1245 multim_rec : OPEN DELIM POINTER DELIM TAG_OBJE
1246 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1248 if (xr == NULL) HANDLE_ERROR;
1249 $<ctxt>$ = start_record(REC_OBJE,
1250 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1251 NULL, GEDCOM_MAKE_NULL(val2));
1252 START(OBJE, $<ctxt>$) }
1254 { CHECK2(FORM, BLOB) }
1256 { end_record(REC_OBJE, $<ctxt>6); }
1259 obje_subs : /* empty */
1260 | obje_subs obje_sub
1263 obje_sub : obje_form_sect { OCCUR2(FORM, 1, 1) }
1264 | obje_titl_sect { OCCUR2(TITL, 0, 1) }
1265 | note_struc_sub /* 0:M */
1266 | obje_blob_sect { OCCUR2(BLOB, 1, 1) }
1267 | obje_obje_sect { OCCUR2(OBJE, 0, 1) }
1268 | ident_struc_sub /* 0:1 */
1269 | change_date_sub /* 0:1 */
1274 obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
1275 { $<ctxt>$ = start_element(ELT_OBJE_FORM,
1277 GEDCOM_MAKE_STRING(val1, $4));
1278 START(FORM, $<ctxt>$)
1283 { end_element(ELT_OBJE_FORM, PARENT, $<ctxt>5, NULL);
1288 obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1289 { $<ctxt>$ = start_element(ELT_OBJE_TITL,
1291 GEDCOM_MAKE_STRING(val1, $4));
1292 START(TITL, $<ctxt>$)
1297 { end_element(ELT_OBJE_TITL, PARENT, $<ctxt>5, NULL);
1302 obje_blob_sect : OPEN DELIM TAG_BLOB
1303 { $<ctxt>$ = start_element(ELT_OBJE_BLOB,
1304 PARENT, $1, $3, NULL,
1305 GEDCOM_MAKE_NULL(val1));
1306 START(BLOB, $<ctxt>$)
1311 { end_element(ELT_OBJE_BLOB, PARENT, $<ctxt>4, NULL);
1315 obje_blob_subs : /* empty */
1316 | obje_blob_subs obje_blob_sub
1319 obje_blob_sub : obje_blob_cont_sect { OCCUR1(CONT, 1) }
1323 obje_blob_cont_sect : OPEN DELIM TAG_CONT mand_line_item
1324 { $<ctxt>$ = start_element(ELT_OBJE_BLOB_CONT,
1326 GEDCOM_MAKE_STRING(val1, $4));
1327 START(CONT, $<ctxt>$)
1332 { end_element(ELT_OBJE_BLOB_CONT, PARENT,
1338 obje_obje_sect : OPEN DELIM TAG_OBJE mand_pointer
1339 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1341 if (xr == NULL) HANDLE_ERROR;
1342 $<ctxt>$ = start_element(ELT_OBJE_OBJE,
1344 GEDCOM_MAKE_XREF_PTR(val1, xr));
1345 START(OBJE, $<ctxt>$)
1350 { end_element(ELT_OBJE_OBJE, PARENT, $<ctxt>5, NULL);
1354 /*********************************************************************/
1355 /**** Note record ****/
1356 /*********************************************************************/
1357 note_rec : OPEN DELIM POINTER DELIM TAG_NOTE note_line_item
1358 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1360 if (xr == NULL) HANDLE_ERROR;
1361 $<ctxt>$ = start_record(REC_NOTE,
1362 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1363 $6, GEDCOM_MAKE_STRING(val2, $6));
1364 START(NOTE, $<ctxt>$) }
1368 { end_record(REC_NOTE, $<ctxt>7); }
1371 note_line_item : /* empty */
1372 { if (!compat_mode(C_FTREE)) {
1373 gedcom_error(_("Missing value")); YYERROR;
1380 { gedcom_debug_print("==Val: %s==", $2);
1384 note_subs : /* empty */
1385 | note_subs note_sub
1388 note_sub : continuation_sub /* 0:M */
1389 | source_cit_sub /* 0:M */
1390 | ident_struc_sub /* 0:1 */
1391 | change_date_sub /* 0:1 */
1395 /*********************************************************************/
1396 /**** Repository record ****/
1397 /*********************************************************************/
1398 repos_rec : OPEN DELIM POINTER DELIM TAG_REPO
1399 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1401 if (xr == NULL) HANDLE_ERROR;
1402 $<ctxt>$ = start_record(REC_REPO,
1403 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1404 NULL, GEDCOM_MAKE_NULL(val2));
1405 START(REPO, $<ctxt>$) }
1409 { end_record(REC_REPO, $<ctxt>6); }
1412 repo_subs : /* empty */
1413 | repo_subs repo_sub
1416 repo_sub : repo_name_sect { OCCUR2(NAME, 0, 1) }
1417 | addr_struc_sub /* 0:1 */
1418 | note_struc_sub /* 0:M */
1419 | ident_struc_sub /* 0:1 */
1420 | change_date_sub /* 0:1 */
1425 repo_name_sect : OPEN DELIM TAG_NAME mand_line_item
1426 { $<ctxt>$ = start_element(ELT_REPO_NAME,
1428 GEDCOM_MAKE_STRING(val1, $4));
1429 START(NAME, $<ctxt>$)
1434 { end_element(ELT_REPO_NAME, PARENT, $<ctxt>5, NULL);
1438 /*********************************************************************/
1439 /**** Source record ****/
1440 /*********************************************************************/
1441 source_rec : OPEN DELIM POINTER DELIM TAG_SOUR
1442 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1444 if (xr == NULL) HANDLE_ERROR;
1445 $<ctxt>$ = start_record(REC_SOUR,
1446 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1447 NULL, GEDCOM_MAKE_NULL(val2));
1448 START(SOUR, $<ctxt>$) }
1452 { end_record(REC_SOUR, $<ctxt>6); }
1455 sour_subs : /* empty */
1456 | sour_subs sour_sub
1459 sour_sub : sour_data_sect { OCCUR2(DATA, 0, 1) }
1460 | sour_auth_sect { OCCUR2(AUTH, 0, 1) }
1461 | sour_titl_sect { OCCUR2(TITL, 0, 1) }
1462 | sour_abbr_sect { OCCUR2(ABBR, 0, 1) }
1463 | sour_publ_sect { OCCUR2(PUBL, 0, 1) }
1464 | sour_text_sect { OCCUR2(TEXT, 0, 1) }
1465 | source_repos_cit_sub /* 0:1 */
1466 | multim_link_sub /* 0:M */
1467 | note_struc_sub /* 0:M */
1468 | ident_struc_sub /* 0:1 */
1469 | change_date_sub /* 0:1 */
1474 sour_data_sect : OPEN DELIM TAG_DATA
1475 { $<ctxt>$ = start_element(ELT_SOUR_DATA,
1476 PARENT, $1, $3, NULL,
1477 GEDCOM_MAKE_NULL(val1));
1478 START(DATA, $<ctxt>$)
1483 { end_element(ELT_SOUR_DATA, PARENT, $<ctxt>4, NULL);
1487 sour_data_subs : /* empty */
1488 | sour_data_subs sour_data_sub
1491 sour_data_sub : sour_data_even_sect /* 0:M */
1492 | sour_data_agnc_sect { OCCUR2(AGNC, 0, 1) }
1493 | note_struc_sub /* 0:M */
1497 sour_data_even_sect : OPEN DELIM TAG_EVEN mand_line_item
1498 { $<ctxt>$ = start_element(ELT_SOUR_DATA_EVEN,
1500 GEDCOM_MAKE_STRING(val1, $4));
1501 START(EVEN, $<ctxt>$)
1506 { end_element(ELT_SOUR_DATA_EVEN, PARENT,
1511 sour_data_even_subs : /* empty */
1512 | sour_data_even_subs sour_data_even_sub
1515 sour_data_even_sub : sour_data_even_date_sect { OCCUR2(DATE, 0, 1) }
1516 | sour_data_even_plac_sect { OCCUR2(PLAC, 0, 1) }
1520 sour_data_even_date_sect : OPEN DELIM TAG_DATE mand_line_item
1521 { struct date_value dv = gedcom_parse_date($4);
1523 = start_element(ELT_SOUR_DATA_EVEN_DATE,
1525 GEDCOM_MAKE_DATE(val1, dv));
1526 START(DATE, $<ctxt>$)
1531 { end_element(ELT_SOUR_DATA_EVEN_DATE, PARENT,
1536 sour_data_even_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
1538 = start_element(ELT_SOUR_DATA_EVEN_PLAC,
1540 GEDCOM_MAKE_STRING(val1, $4));
1541 START(PLAC, $<ctxt>$)
1546 { end_element(ELT_SOUR_DATA_EVEN_PLAC, PARENT,
1551 sour_data_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
1552 { $<ctxt>$ = start_element(ELT_SOUR_DATA_AGNC,
1554 GEDCOM_MAKE_STRING(val1, $4));
1555 START(AGNC, $<ctxt>$)
1560 { end_element(ELT_SOUR_DATA_AGNC, PARENT,
1566 sour_auth_sect : OPEN DELIM TAG_AUTH mand_line_item
1567 { $<ctxt>$ = start_element(ELT_SOUR_AUTH,
1569 GEDCOM_MAKE_STRING(val1, $4));
1570 START(AUTH, $<ctxt>$)
1575 { end_element(ELT_SOUR_AUTH, PARENT, $<ctxt>5, NULL);
1579 sour_auth_subs : /* empty */
1580 | sour_auth_subs sour_auth_sub
1583 sour_auth_sub : continuation_sub /* 0:M */
1588 sour_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1589 { $<ctxt>$ = start_element(ELT_SOUR_TITL,
1591 GEDCOM_MAKE_STRING(val1, $4));
1592 START(TITL, $<ctxt>$)
1597 { end_element(ELT_SOUR_TITL, PARENT, $<ctxt>5, NULL);
1601 sour_titl_subs : /* empty */
1602 | sour_titl_subs sour_titl_sub
1605 sour_titl_sub : continuation_sub /* 0:M */
1610 sour_abbr_sect : OPEN DELIM TAG_ABBR mand_line_item
1611 { $<ctxt>$ = start_element(ELT_SOUR_ABBR,
1613 GEDCOM_MAKE_STRING(val1, $4));
1614 START(ABBR, $<ctxt>$)
1619 { end_element(ELT_SOUR_ABBR, PARENT, $<ctxt>5, NULL);
1624 sour_publ_sect : OPEN DELIM TAG_PUBL mand_line_item
1625 { $<ctxt>$ = start_element(ELT_SOUR_PUBL,
1627 GEDCOM_MAKE_STRING(val1, $4));
1628 START(PUBL, $<ctxt>$)
1633 { end_element(ELT_SOUR_PUBL, PARENT, $<ctxt>5, NULL);
1637 sour_publ_subs : /* empty */
1638 | sour_publ_subs sour_publ_sub
1641 sour_publ_sub : continuation_sub /* 0:M */
1646 sour_text_sect : OPEN DELIM TAG_TEXT mand_line_item
1647 { $<ctxt>$ = start_element(ELT_SOUR_TEXT,
1649 GEDCOM_MAKE_STRING(val1, $4));
1650 START(TEXT, $<ctxt>$)
1655 { end_element(ELT_SOUR_TEXT, PARENT, $<ctxt>5, NULL);
1659 sour_text_subs : /* empty */
1660 | sour_text_subs sour_text_sub
1663 sour_text_sub : continuation_sub /* 0:M */
1667 /*********************************************************************/
1668 /**** Submission record ****/
1669 /*********************************************************************/
1670 submis_rec : OPEN DELIM POINTER DELIM TAG_SUBN
1671 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1673 if (xr == NULL) HANDLE_ERROR;
1674 $<ctxt>$ = start_record(REC_SUBN,
1675 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1676 NULL, GEDCOM_MAKE_NULL(val2));
1677 START(SUBN, $<ctxt>$) }
1681 { end_record(REC_SUBN, $<ctxt>6); }
1684 subn_subs : /* empty */
1685 | subn_subs subn_sub
1688 subn_sub : subn_subm_sect { OCCUR2(SUBM, 0, 1) }
1689 | subn_famf_sect { OCCUR2(FAMF, 0, 1) }
1690 | subn_temp_sect { OCCUR2(TEMP, 0, 1) }
1691 | subn_ance_sect { OCCUR2(ANCE, 0, 1) }
1692 | subn_desc_sect { OCCUR2(DESC, 0, 1) }
1693 | subn_ordi_sect { OCCUR2(ORDI, 0, 1) }
1694 | subn_rin_sect { OCCUR2(RIN, 0, 1) }
1699 subn_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1700 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1702 if (xr == NULL) HANDLE_ERROR;
1703 $<ctxt>$ = start_element(ELT_SUBN_SUBM,
1705 GEDCOM_MAKE_XREF_PTR(val1, xr));
1706 START(SUBM, $<ctxt>$)
1711 { end_element(ELT_SUBN_SUBM, PARENT, $<ctxt>5, NULL);
1716 subn_famf_sect : OPEN DELIM TAG_FAMF mand_line_item
1717 { $<ctxt>$ = start_element(ELT_SUBN_FAMF,
1719 GEDCOM_MAKE_STRING(val1, $4));
1720 START(FAMF, $<ctxt>$)
1725 { end_element(ELT_SUBN_FAMF, PARENT, $<ctxt>5, NULL);
1730 subn_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
1731 { $<ctxt>$ = start_element(ELT_SUBN_TEMP,
1733 GEDCOM_MAKE_STRING(val1, $4));
1734 START(TEMP, $<ctxt>$)
1739 { end_element(ELT_SUBN_TEMP, PARENT, $<ctxt>5, NULL);
1744 subn_ance_sect : OPEN DELIM TAG_ANCE mand_line_item
1745 { $<ctxt>$ = start_element(ELT_SUBN_ANCE,
1747 GEDCOM_MAKE_STRING(val1, $4));
1748 START(ANCE, $<ctxt>$)
1753 { end_element(ELT_SUBN_ANCE, PARENT, $<ctxt>5, NULL);
1758 subn_desc_sect : OPEN DELIM TAG_DESC mand_line_item
1759 { $<ctxt>$ = start_element(ELT_SUBN_DESC,
1761 GEDCOM_MAKE_STRING(val1, $4));
1762 START(DESC, $<ctxt>$)
1767 { end_element(ELT_SUBN_DESC, PARENT, $<ctxt>5, NULL);
1772 subn_ordi_sect : OPEN DELIM TAG_ORDI mand_line_item
1773 { $<ctxt>$ = start_element(ELT_SUBN_ORDI,
1775 GEDCOM_MAKE_STRING(val1, $4));
1776 START(ORDI, $<ctxt>$)
1781 { end_element(ELT_SUBN_ORDI, PARENT, $<ctxt>5, NULL);
1786 subn_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1787 { $<ctxt>$ = start_element(ELT_SUBN_RIN,
1789 GEDCOM_MAKE_STRING(val1, $4));
1790 START(RIN, $<ctxt>$)
1795 { end_element(ELT_SUBN_RIN, PARENT, $<ctxt>5, NULL);
1799 /*********************************************************************/
1800 /**** Submitter record ****/
1801 /*********************************************************************/
1802 submit_rec : OPEN DELIM POINTER DELIM TAG_SUBM
1803 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1805 if (xr == NULL) HANDLE_ERROR;
1806 $<ctxt>$ = start_record(REC_SUBM,
1807 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1808 NULL, GEDCOM_MAKE_NULL(val2));
1809 START(SUBM, $<ctxt>$) }
1813 { end_record(REC_SUBM, $<ctxt>6); }
1816 subm_subs : /* empty */
1817 | subm_subs subm_sub
1820 subm_sub : subm_name_sect { OCCUR2(NAME, 1, 1) }
1821 | addr_struc_sub /* 0:1 */
1822 | multim_link_sub /* 0:M */
1823 | subm_lang_sect { OCCUR2(LANG, 0, 3) }
1824 | subm_rfn_sect { OCCUR2(RFN, 0, 1) }
1825 | subm_rin_sect { OCCUR2(RIN, 0, 1) }
1826 | change_date_sub /* 0:1 */
1831 subm_name_sect : OPEN DELIM TAG_NAME mand_line_item
1832 { $<ctxt>$ = start_element(ELT_SUBM_NAME,
1834 GEDCOM_MAKE_STRING(val1, $4));
1835 START(NAME, $<ctxt>$)
1840 { end_element(ELT_SUBM_NAME, PARENT, $<ctxt>5, NULL);
1845 subm_lang_sect : OPEN DELIM TAG_LANG mand_line_item
1846 { $<ctxt>$ = start_element(ELT_SUBM_LANG,
1848 GEDCOM_MAKE_STRING(val1, $4));
1849 START(LANG, $<ctxt>$)
1854 { end_element(ELT_SUBM_LANG, PARENT, $<ctxt>5, NULL);
1859 subm_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1860 { $<ctxt>$ = start_element(ELT_SUBM_RFN,
1862 GEDCOM_MAKE_STRING(val1, $4));
1863 START(RFN, $<ctxt>$)
1868 { end_element(ELT_SUBM_RFN, PARENT, $<ctxt>5, NULL);
1873 subm_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1874 { $<ctxt>$ = start_element(ELT_SUBM_RIN,
1876 GEDCOM_MAKE_STRING(val1, $4));
1877 START(RIN, $<ctxt>$)
1882 { end_element(ELT_SUBM_RIN, PARENT, $<ctxt>5, NULL);
1886 /*********************************************************************/
1887 /**** Substructures ****/
1888 /*********************************************************************/
1890 /* ADDRESS STRUCTURE */
1891 addr_struc_sub : addr_sect { OCCUR2(ADDR, 0, 1) }
1892 | phon_sect { OCCUR2(PHON, 0, 3) }
1895 addr_sect : OPEN DELIM TAG_ADDR mand_line_item
1896 { $<ctxt>$ = start_element(ELT_SUB_ADDR,
1898 GEDCOM_MAKE_STRING(val1, $4));
1899 START(ADDR, $<ctxt>$)
1904 { end_element(ELT_SUB_ADDR, PARENT, $<ctxt>5, NULL);
1908 addr_subs : /* empty */
1909 | addr_subs addr_sub
1912 addr_sub : addr_cont_sect /* 0:M */
1913 | addr_adr1_sect { OCCUR2(ADR1, 0, 1) }
1914 | addr_adr2_sect { OCCUR2(ADR2, 0, 1) }
1915 | addr_city_sect { OCCUR2(CITY, 0, 1) }
1916 | addr_stae_sect { OCCUR2(STAE, 0, 1) }
1917 | addr_post_sect { OCCUR2(POST, 0, 1) }
1918 | addr_ctry_sect { OCCUR2(CTRY, 0, 1) }
1922 addr_cont_sect : OPEN DELIM TAG_CONT mand_line_item
1923 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CONT,
1925 GEDCOM_MAKE_STRING(val1, $4));
1926 START(CONT, $<ctxt>$)
1931 { end_element(ELT_SUB_ADDR_CONT, PARENT, $<ctxt>5, NULL);
1934 addr_adr1_sect : OPEN DELIM TAG_ADR1 mand_line_item
1935 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR1,
1937 GEDCOM_MAKE_STRING(val1, $4));
1938 START(ADR1, $<ctxt>$)
1943 { end_element(ELT_SUB_ADDR_ADR1, PARENT, $<ctxt>5, NULL);
1946 addr_adr2_sect : OPEN DELIM TAG_ADR2 mand_line_item
1947 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR2,
1949 GEDCOM_MAKE_STRING(val1, $4));
1950 START(ADR2, $<ctxt>$)
1955 { end_element(ELT_SUB_ADDR_ADR2, PARENT, $<ctxt>5, NULL);
1958 addr_city_sect : OPEN DELIM TAG_CITY mand_line_item
1959 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CITY,
1961 GEDCOM_MAKE_STRING(val1, $4));
1962 START(CITY, $<ctxt>$)
1967 { end_element(ELT_SUB_ADDR_CITY, PARENT, $<ctxt>5, NULL);
1970 addr_stae_sect : OPEN DELIM TAG_STAE mand_line_item
1971 { $<ctxt>$ = start_element(ELT_SUB_ADDR_STAE,
1973 GEDCOM_MAKE_STRING(val1, $4));
1974 START(STAE, $<ctxt>$)
1979 { end_element(ELT_SUB_ADDR_STAE, PARENT, $<ctxt>5, NULL);
1982 addr_post_sect : OPEN DELIM TAG_POST mand_line_item
1983 { $<ctxt>$ = start_element(ELT_SUB_ADDR_POST,
1985 GEDCOM_MAKE_STRING(val1, $4));
1986 START(POST, $<ctxt>$)
1991 { end_element(ELT_SUB_ADDR_POST, PARENT, $<ctxt>5, NULL);
1994 addr_ctry_sect : OPEN DELIM TAG_CTRY mand_line_item
1995 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CTRY,
1997 GEDCOM_MAKE_STRING(val1, $4));
1998 START(CTRY, $<ctxt>$)
2003 { end_element(ELT_SUB_ADDR_CTRY, PARENT, $<ctxt>5, NULL);
2007 phon_sect : OPEN DELIM TAG_PHON mand_line_item
2008 { $<ctxt>$ = start_element(ELT_SUB_PHON,
2010 GEDCOM_MAKE_STRING(val1, $4));
2011 START(PHON, $<ctxt>$)
2016 { end_element(ELT_SUB_PHON, PARENT, $<ctxt>5, NULL);
2020 /* ASSOCIATION STRUCTURE */
2021 assoc_struc_sub : asso_sect /* 0:M */
2024 asso_sect : OPEN DELIM TAG_ASSO mand_pointer
2025 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2027 if (xr == NULL) HANDLE_ERROR;
2028 $<ctxt>$ = start_element(ELT_SUB_ASSO,
2030 GEDCOM_MAKE_XREF_PTR(val1, xr));
2031 START(ASSO, $<ctxt>$)
2034 { CHECK2(TYPE,RELA) }
2036 { end_element(ELT_SUB_ASSO, PARENT, $<ctxt>5, NULL);
2040 asso_subs : /* empty */
2041 | asso_type_sect { OCCUR2(TYPE, 1, 1) }
2042 | asso_rela_sect { OCCUR2(RELA, 1, 1) }
2048 asso_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2049 { $<ctxt>$ = start_element(ELT_SUB_ASSO_TYPE,
2051 GEDCOM_MAKE_STRING(val1, $4));
2052 START(TYPE, $<ctxt>$)
2057 { end_element(ELT_SUB_ASSO_TYPE, PARENT, $<ctxt>5, NULL);
2061 asso_rela_sect : OPEN DELIM TAG_RELA mand_line_item
2062 { $<ctxt>$ = start_element(ELT_SUB_ASSO_RELA,
2064 GEDCOM_MAKE_STRING(val1, $4));
2065 START(RELA, $<ctxt>$)
2070 { end_element(ELT_SUB_ASSO_RELA, PARENT, $<ctxt>5, NULL);
2075 change_date_sub : change_date_chan_sect { OCCUR2(CHAN, 0, 1) }
2078 change_date_chan_sect : OPEN DELIM TAG_CHAN
2079 { $<ctxt>$ = start_element(ELT_SUB_CHAN,
2080 PARENT, $1, $3, NULL,
2081 GEDCOM_MAKE_NULL(val1));
2082 START(CHAN, $<ctxt>$)
2084 change_date_chan_subs
2087 { end_element(ELT_SUB_CHAN, PARENT, $<ctxt>4, NULL);
2091 change_date_chan_subs : /* empty */
2092 | change_date_chan_subs change_date_chan_sub
2095 change_date_chan_sub : change_date_date_sect { OCCUR2(DATE, 1, 1) }
2100 change_date_date_sect : OPEN DELIM TAG_DATE mand_line_item
2101 { struct date_value dv = gedcom_parse_date($4);
2102 $<ctxt>$ = start_element(ELT_SUB_CHAN_DATE,
2104 GEDCOM_MAKE_DATE(val1, dv));
2105 START(DATE, $<ctxt>$) }
2106 change_date_date_subs
2109 { end_element(ELT_SUB_CHAN_DATE, PARENT, $<ctxt>5,
2114 change_date_date_subs : /* empty */
2115 | change_date_date_subs change_date_date_sub
2118 change_date_date_sub : change_date_date_time_sect { OCCUR2(TIME, 0, 1) }
2122 change_date_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
2124 = start_element(ELT_SUB_CHAN_TIME,
2126 GEDCOM_MAKE_STRING(val1, $4));
2127 START(TIME, $<ctxt>$)
2132 { end_element(ELT_SUB_CHAN_TIME, PARENT, $<ctxt>5,
2137 /* CHILD TO FAMILY LINK */
2138 chi_fam_link_sub : famc_sect /* 0:M */
2141 famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2142 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2144 if (xr == NULL) HANDLE_ERROR;
2145 $<ctxt>$ = start_element(ELT_SUB_FAMC,
2147 GEDCOM_MAKE_XREF_PTR(val1, xr));
2148 START(FAMC, $<ctxt>$)
2153 { end_element(ELT_SUB_FAMC, PARENT, $<ctxt>5, NULL);
2157 famc_subs : /* empty */
2158 | famc_subs famc_sub
2161 famc_sub : famc_pedi_sect /* 0:M */
2166 famc_pedi_sect : OPEN DELIM TAG_PEDI mand_line_item
2167 { $<ctxt>$ = start_element(ELT_SUB_FAMC_PEDI,
2169 GEDCOM_MAKE_STRING(val1, $4));
2170 START(PEDI, $<ctxt>$)
2175 { end_element(ELT_SUB_FAMC_PEDI, PARENT, $<ctxt>5, NULL);
2179 /* CONTINUATION SUBSECTIONS */
2180 continuation_sub : cont_sect /* 0:M */
2181 | conc_sect /* 0:M */
2184 cont_sect : OPEN DELIM TAG_CONT mand_line_item
2185 { $<ctxt>$ = start_element(ELT_SUB_CONT,
2187 GEDCOM_MAKE_STRING(val1, $4));
2188 START(CONT, $<ctxt>$)
2193 { end_element(ELT_SUB_CONT, PARENT, $<ctxt>5, NULL);
2197 conc_sect : OPEN DELIM TAG_CONC mand_line_item
2198 { $<ctxt>$ = start_element(ELT_SUB_CONC,
2200 GEDCOM_MAKE_STRING(val1, $4));
2201 START(CONC, $<ctxt>$)
2206 { end_element(ELT_SUB_CONC, PARENT, $<ctxt>5, NULL);
2211 event_detail_sub : event_detail_type_sect { OCCUR2(TYPE, 0, 1) }
2212 | event_detail_date_sect { OCCUR2(DATE, 0, 1) }
2215 | event_detail_age_sect { OCCUR2(AGE, 0, 1) }
2216 | event_detail_agnc_sect { OCCUR2(AGNC, 0, 1) }
2217 | event_detail_caus_sect { OCCUR2(CAUS, 0, 1) }
2223 event_detail_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2225 = start_element(ELT_SUB_EVT_TYPE,
2227 GEDCOM_MAKE_STRING(val1, $4));
2228 START(TYPE, $<ctxt>$)
2233 { end_element(ELT_SUB_EVT_TYPE, PARENT, $<ctxt>5,
2237 event_detail_date_sect : OPEN DELIM TAG_DATE mand_line_item
2238 { struct date_value dv = gedcom_parse_date($4);
2240 = start_element(ELT_SUB_EVT_DATE,
2242 GEDCOM_MAKE_DATE(val1, dv));
2243 START(DATE, $<ctxt>$)
2248 { end_element(ELT_SUB_EVT_DATE, PARENT, $<ctxt>5,
2252 event_detail_age_sect : OPEN DELIM TAG_AGE mand_line_item
2254 = start_element(ELT_SUB_EVT_AGE,
2256 GEDCOM_MAKE_STRING(val1, $4));
2257 START(AGE, $<ctxt>$)
2262 { end_element(ELT_SUB_EVT_AGE, PARENT, $<ctxt>5,
2266 event_detail_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
2268 = start_element(ELT_SUB_EVT_AGNC,
2270 GEDCOM_MAKE_STRING(val1, $4));
2271 START(AGNC, $<ctxt>$)
2276 { end_element(ELT_SUB_EVT_AGNC, PARENT, $<ctxt>5,
2280 event_detail_caus_sect : OPEN DELIM TAG_CAUS mand_line_item
2282 = start_element(ELT_SUB_EVT_CAUS,
2284 GEDCOM_MAKE_STRING(val1, $4));
2285 START(CAUS, $<ctxt>$)
2290 { end_element(ELT_SUB_EVT_CAUS, PARENT, $<ctxt>5,
2295 /* FAMILY EVENT STRUCTURE */
2296 fam_event_struc_sub : fam_event_sect
2297 | fam_gen_even_sect /* 0:M */
2300 fam_event_sect : OPEN DELIM fam_event_tag opt_value
2302 = start_element(ELT_SUB_FAM_EVT,
2304 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2310 { end_element(ELT_SUB_FAM_EVT, PARENT, $<ctxt>5, NULL);
2314 fam_event_tag : TAG_ANUL { $$ = $1; START1(ANUL) }
2315 | TAG_CENS { $$ = $1; START1(CENS) }
2316 | TAG_DIV { $$ = $1; START1(DIV) }
2317 | TAG_DIVF { $$ = $1; START1(DIVF) }
2318 | TAG_ENGA { $$ = $1; START1(ENGA) }
2319 | TAG_MARR { $$ = $1; START1(MARR) }
2320 | TAG_MARB { $$ = $1; START1(MARB) }
2321 | TAG_MARC { $$ = $1; START1(MARC) }
2322 | TAG_MARL { $$ = $1; START1(MARL) }
2323 | TAG_MARS { $$ = $1; START1(MARS) }
2326 fam_event_subs : /* empty */
2327 | fam_event_subs fam_event_sub
2330 fam_event_sub : event_detail_sub
2331 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2332 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2336 fam_even_husb_sect : OPEN DELIM TAG_HUSB
2337 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_HUSB,
2338 PARENT, $1, $3, NULL,
2339 GEDCOM_MAKE_NULL(val1));
2340 START(HUSB, $<ctxt>$)
2345 { end_element(ELT_SUB_FAM_EVT_HUSB, PARENT, $<ctxt>4,
2350 fam_even_husb_subs : /* empty */
2351 | fam_even_husb_subs fam_even_husb_sub
2354 fam_even_husb_sub : fam_even_age_sect { OCCUR2(AGE, 1, 1) }
2358 fam_even_age_sect : OPEN DELIM TAG_AGE mand_line_item
2359 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_AGE,
2361 GEDCOM_MAKE_STRING(val1, $4));
2362 START(AGE, $<ctxt>$)
2367 { end_element(ELT_SUB_FAM_EVT_AGE, PARENT, $<ctxt>5,
2372 fam_even_wife_sect : OPEN DELIM TAG_WIFE
2373 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_WIFE,
2374 PARENT, $1, $3, NULL,
2375 GEDCOM_MAKE_NULL(val1));
2376 START(WIFE, $<ctxt>$)
2381 { end_element(ELT_SUB_FAM_EVT_WIFE, PARENT, $<ctxt>4,
2386 fam_gen_even_sect : OPEN DELIM TAG_EVEN
2387 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_EVEN,
2388 PARENT, $1, $3, NULL,
2389 GEDCOM_MAKE_NULL(val1));
2390 START(EVEN, $<ctxt>$)
2395 { end_element(ELT_SUB_FAM_EVT_EVEN, PARENT, $<ctxt>4,
2400 fam_gen_even_subs : /* empty */
2401 | fam_gen_even_subs fam_gen_even_sub
2404 fam_gen_even_sub : event_detail_sub
2405 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2406 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2410 /* IDENTIFICATION STRUCTURE */
2411 ident_struc_sub : ident_refn_sect /* 0:M */
2412 | ident_rin_sect { OCCUR2(RIN, 0, 1) }
2415 ident_refn_sect : OPEN DELIM TAG_REFN mand_line_item
2416 { $<ctxt>$ = start_element(ELT_SUB_IDENT_REFN,
2418 GEDCOM_MAKE_STRING(val1, $4));
2419 START(REFN, $<ctxt>$)
2424 { end_element(ELT_SUB_IDENT_REFN, PARENT, $<ctxt>5,
2429 ident_refn_subs : /* empty */
2430 | ident_refn_subs ident_refn_sub
2433 ident_refn_sub : ident_refn_type_sect { OCCUR2(TYPE, 0, 1) }
2437 ident_refn_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2439 = start_element(ELT_SUB_IDENT_REFN_TYPE,
2441 GEDCOM_MAKE_STRING(val1, $4));
2442 START(TYPE, $<ctxt>$)
2447 { end_element(ELT_SUB_IDENT_REFN_TYPE, PARENT, $<ctxt>5,
2452 ident_rin_sect : OPEN DELIM TAG_RIN mand_line_item
2453 { $<ctxt>$ = start_element(ELT_SUB_IDENT_RIN,
2455 GEDCOM_MAKE_STRING(val1, $4));
2456 START(RIN, $<ctxt>$)
2461 { end_element(ELT_SUB_IDENT_RIN, PARENT, $<ctxt>5,
2466 /* INDIVIDUAL ATTRIBUTE STRUCTURE */
2467 indiv_attr_struc_sub : indiv_attr_sect /* 0:M */
2468 | indiv_resi_sect /* 0:M */
2471 indiv_attr_sect : OPEN DELIM indiv_attr_tag mand_line_item
2472 { $<ctxt>$ = start_element(ELT_SUB_INDIV_ATTR,
2474 GEDCOM_MAKE_STRING(val1, $4));
2477 indiv_attr_event_subs
2480 { end_element(ELT_SUB_INDIV_ATTR, PARENT, $<ctxt>5, NULL);
2483 indiv_attr_tag : TAG_CAST { $$ = $1; START1(CAST) }
2484 | TAG_DSCR { $$ = $1; START1(DSCR) }
2485 | TAG_EDUC { $$ = $1; START1(EDUC) }
2486 | TAG_IDNO { $$ = $1; START1(IDNO) }
2487 | TAG_NATI { $$ = $1; START1(NATI) }
2488 | TAG_NCHI { $$ = $1; START1(NCHI) }
2489 | TAG_NMR { $$ = $1; START1(NMR) }
2490 | TAG_OCCU { $$ = $1; START1(OCCU) }
2491 | TAG_PROP { $$ = $1; START1(PROP) }
2492 | TAG_RELI { $$ = $1; START1(RELI) }
2493 | TAG_SSN { $$ = $1; START1(SSN) }
2494 | TAG_TITL { $$ = $1; START1(TITL) }
2496 indiv_resi_sect : OPEN DELIM TAG_RESI
2497 { $<ctxt>$ = start_element(ELT_SUB_INDIV_RESI,
2498 PARENT, $1, $3, NULL,
2499 GEDCOM_MAKE_NULL(val1));
2500 START(RESI, $<ctxt>$)
2502 indiv_attr_event_subs
2505 { end_element(ELT_SUB_INDIV_RESI, PARENT, $<ctxt>4, NULL);
2509 indiv_attr_event_subs : /* empty */
2510 | indiv_attr_event_subs indiv_attr_event_sub
2513 indiv_attr_event_sub : event_detail_sub
2517 /* INDIVIDUAL EVENT STRUCTURE */
2518 indiv_even_struc_sub : indiv_birt_sect
2520 | indiv_adop_sect /* 0:M */
2521 | indiv_even_sect /* 0:M */
2524 indiv_birt_sect : OPEN DELIM indiv_birt_tag opt_value
2526 = start_element(ELT_SUB_INDIV_BIRT,
2528 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2534 { end_element(ELT_SUB_INDIV_BIRT, PARENT, $<ctxt>5, NULL);
2538 indiv_birt_tag : TAG_BIRT { $$ = $1; START1(BIRT) }
2539 | TAG_CHR { $$ = $1; START1(CHR) }
2542 indiv_birt_subs : /* empty */
2543 | indiv_birt_subs indiv_birt_sub
2546 indiv_birt_sub : event_detail_sub
2547 | indiv_birt_famc_sect { OCCUR2(FAMC,0, 1) }
2551 indiv_birt_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2552 { struct xref_value *xr = gedcom_parse_xref($4,
2555 if (xr == NULL) HANDLE_ERROR;
2557 = start_element(ELT_SUB_INDIV_BIRT_FAMC,
2559 GEDCOM_MAKE_XREF_PTR(val1, xr));
2560 START(FAMC, $<ctxt>$)
2565 { end_element(ELT_SUB_INDIV_BIRT_FAMC, PARENT, $<ctxt>5,
2570 indiv_gen_sect : OPEN DELIM indiv_gen_tag opt_value
2572 = start_element(ELT_SUB_INDIV_GEN,
2574 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2580 { end_element(ELT_SUB_INDIV_GEN, PARENT, $<ctxt>5, NULL);
2584 indiv_gen_tag : TAG_DEAT { $$ = $1; START1(DEAT) }
2585 | TAG_BURI { $$ = $1; START1(BURI) }
2586 | TAG_CREM { $$ = $1; START1(CREM) }
2587 | TAG_BAPM { $$ = $1; START1(BAPM) }
2588 | TAG_BARM { $$ = $1; START1(BARM) }
2589 | TAG_BASM { $$ = $1; START1(BASM) }
2590 | TAG_BLES { $$ = $1; START1(BLES) }
2591 | TAG_CHRA { $$ = $1; START1(CHRA) }
2592 | TAG_CONF { $$ = $1; START1(CONF) }
2593 | TAG_FCOM { $$ = $1; START1(FCOM) }
2594 | TAG_ORDN { $$ = $1; START1(ORDN) }
2595 | TAG_NATU { $$ = $1; START1(NATU) }
2596 | TAG_EMIG { $$ = $1; START1(EMIG) }
2597 | TAG_IMMI { $$ = $1; START1(IMMI) }
2598 | TAG_CENS { $$ = $1; START1(CENS) }
2599 | TAG_PROB { $$ = $1; START1(PROB) }
2600 | TAG_WILL { $$ = $1; START1(WILL) }
2601 | TAG_GRAD { $$ = $1; START1(GRAD) }
2602 | TAG_RETI { $$ = $1; START1(RETI) }
2605 indiv_gen_subs : /* empty */
2606 | indiv_gen_subs indiv_gen_sub
2609 indiv_gen_sub : event_detail_sub
2613 indiv_adop_sect : OPEN DELIM TAG_ADOP opt_value
2615 = start_element(ELT_SUB_INDIV_ADOP,
2617 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2618 START(ADOP, $<ctxt>$) }
2622 { end_element(ELT_SUB_INDIV_ADOP, PARENT, $<ctxt>5, NULL);
2626 indiv_adop_subs : /* empty */
2627 | indiv_adop_subs indiv_adop_sub
2630 indiv_adop_sub : event_detail_sub
2631 | indiv_adop_famc_sect { OCCUR2(FAMC,0, 1) }
2635 indiv_adop_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2636 { struct xref_value *xr = gedcom_parse_xref($4,
2639 if (xr == NULL) HANDLE_ERROR;
2641 = start_element(ELT_SUB_INDIV_ADOP_FAMC,
2643 GEDCOM_MAKE_XREF_PTR(val1, xr));
2644 START(FAMC, $<ctxt>$) }
2645 indiv_adop_famc_subs
2648 { end_element(ELT_SUB_INDIV_ADOP_FAMC, PARENT, $<ctxt>5,
2653 indiv_adop_famc_subs : /* empty */
2654 | indiv_adop_famc_subs indiv_adop_famc_sub
2657 indiv_adop_famc_sub : indiv_adop_famc_adop_sect { OCCUR2(ADOP,0, 1) }
2661 indiv_adop_famc_adop_sect : OPEN DELIM TAG_ADOP mand_line_item
2663 = start_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2665 GEDCOM_MAKE_STRING(val1, $4));
2666 START(ADOP, $<ctxt>$) }
2670 { end_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2671 PARENT, $<ctxt>5, NULL);
2675 indiv_even_sect : OPEN DELIM TAG_EVEN
2676 { $<ctxt>$ = start_element(ELT_SUB_INDIV_EVEN,
2677 PARENT, $1, $3, NULL,
2678 GEDCOM_MAKE_NULL(val1));
2679 START(EVEN, $<ctxt>$) }
2683 { end_element(ELT_SUB_INDIV_EVEN, PARENT, $<ctxt>4, NULL);
2687 /* LDS INDIVIDUAL ORDINANCE */
2688 lds_indiv_ord_sub : lio_bapl_sect /* 0:M */
2689 | lio_slgc_sect /* 0:M */
2692 lio_bapl_sect : OPEN DELIM lio_bapl_tag
2693 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL,
2694 PARENT, $1, $3, NULL,
2695 GEDCOM_MAKE_NULL(val1));
2701 { end_element(ELT_SUB_LIO_BAPL, PARENT, $<ctxt>4, NULL);
2705 lio_bapl_tag : TAG_BAPL { $$ = $1; START1(BAPL) }
2706 | TAG_CONL { $$ = $1; START1(CONL) }
2707 | TAG_ENDL { $$ = $1; START1(ENDL) }
2710 lio_bapl_subs : /* empty */
2711 | lio_bapl_subs lio_bapl_sub
2714 lio_bapl_sub : lio_bapl_stat_sect { OCCUR2(STAT, 0, 1) }
2715 | lio_bapl_date_sect { OCCUR2(DATE, 0, 1) }
2716 | lio_bapl_temp_sect { OCCUR2(TEMP, 0, 1) }
2717 | lio_bapl_plac_sect { OCCUR2(PLAC, 0, 1) }
2723 lio_bapl_stat_sect : OPEN DELIM TAG_STAT mand_line_item
2724 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_STAT,
2726 GEDCOM_MAKE_STRING(val1, $4));
2727 START(STAT, $<ctxt>$)
2732 { end_element(ELT_SUB_LIO_BAPL_STAT, PARENT, $<ctxt>5,
2736 lio_bapl_date_sect : OPEN DELIM TAG_DATE mand_line_item
2737 { struct date_value dv = gedcom_parse_date($4);
2738 $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_DATE,
2740 GEDCOM_MAKE_DATE(val1, dv));
2741 START(DATE, $<ctxt>$)
2746 { end_element(ELT_SUB_LIO_BAPL_DATE, PARENT, $<ctxt>5,
2750 lio_bapl_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
2751 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_TEMP,
2753 GEDCOM_MAKE_STRING(val1, $4));
2754 START(TEMP, $<ctxt>$)
2759 { end_element(ELT_SUB_LIO_BAPL_TEMP, PARENT, $<ctxt>5,
2763 lio_bapl_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
2764 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_PLAC,
2766 GEDCOM_MAKE_STRING(val1, $4));
2767 START(PLAC, $<ctxt>$)
2772 { end_element(ELT_SUB_LIO_BAPL_PLAC, PARENT, $<ctxt>5,
2777 lio_slgc_sect : OPEN DELIM TAG_SLGC
2778 { $<ctxt>$ = start_element(ELT_SUB_LIO_SLGC,
2779 PARENT, $1, $3, NULL,
2780 GEDCOM_MAKE_NULL(val1));
2781 START(SLGC, $<ctxt>$)
2786 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4, NULL);
2790 lio_slgc_subs : /* empty */
2791 | lio_slgc_subs lio_slgc_sub
2794 lio_slgc_sub : lio_bapl_sub
2795 | lio_slgc_famc_sect { OCCUR2(FAMC, 1, 1) }
2798 lio_slgc_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2799 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2801 if (xr == NULL) HANDLE_ERROR;
2803 = start_element(ELT_SUB_LIO_SLGC_FAMC,
2805 GEDCOM_MAKE_XREF_PTR(val1, xr));
2806 START(FAMC, $<ctxt>$)
2811 { end_element(ELT_SUB_LIO_SLGC_FAMC, PARENT, $<ctxt>5,
2816 /* LDS SPOUSE SEALING */
2817 lds_spouse_seal_sub : lss_slgs_sect
2820 lss_slgs_sect : OPEN DELIM TAG_SLGS
2821 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS,
2822 PARENT, $1, $3, NULL,
2823 GEDCOM_MAKE_NULL(val1));
2824 START(SLGS, $<ctxt>$) }
2828 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4, NULL);
2832 lss_slgs_subs : /* empty */
2833 | lss_slgs_subs lss_slgs_sub
2836 lss_slgs_sub : lss_slgs_stat_sect { OCCUR2(STAT, 0, 1) }
2837 | lss_slgs_date_sect { OCCUR2(DATE, 0, 1) }
2838 | lss_slgs_temp_sect { OCCUR2(TEMP, 0, 1) }
2839 | lss_slgs_plac_sect { OCCUR2(PLAC, 0, 1) }
2845 lss_slgs_stat_sect : OPEN DELIM TAG_STAT mand_line_item
2846 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_STAT,
2848 GEDCOM_MAKE_STRING(val1, $4));
2849 START(STAT, $<ctxt>$)
2854 { end_element(ELT_SUB_LSS_SLGS_STAT, PARENT, $<ctxt>5,
2858 lss_slgs_date_sect : OPEN DELIM TAG_DATE mand_line_item
2859 { struct date_value dv = gedcom_parse_date($4);
2860 $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_DATE,
2862 GEDCOM_MAKE_DATE(val1, dv));
2863 START(DATE, $<ctxt>$)
2868 { end_element(ELT_SUB_LSS_SLGS_DATE, PARENT, $<ctxt>5,
2872 lss_slgs_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
2873 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_TEMP,
2875 GEDCOM_MAKE_STRING(val1, $4));
2876 START(TEMP, $<ctxt>$)
2881 { end_element(ELT_SUB_LSS_SLGS_TEMP, PARENT, $<ctxt>5,
2885 lss_slgs_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
2886 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_PLAC,
2888 GEDCOM_MAKE_STRING(val1, $4));
2889 START(PLAC, $<ctxt>$)
2894 { end_element(ELT_SUB_LSS_SLGS_PLAC, PARENT, $<ctxt>5,
2899 /* MULTIMEDIA LINK */
2900 multim_link_sub : multim_obje_link_sect
2901 | multim_obje_emb_sect
2904 multim_obje_link_sect : OPEN DELIM TAG_OBJE DELIM POINTER
2905 { struct xref_value *xr = gedcom_parse_xref($5,
2908 if (xr == NULL) HANDLE_ERROR;
2910 = start_element(ELT_SUB_MULTIM_OBJE,
2912 GEDCOM_MAKE_XREF_PTR(val1, xr));
2913 START(OBJE, $<ctxt>$)
2918 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>6,
2923 multim_obje_emb_sect : OPEN DELIM TAG_OBJE
2924 { $<ctxt>$ = start_element(ELT_SUB_MULTIM_OBJE,
2925 PARENT, $1, $3, NULL,
2926 GEDCOM_MAKE_NULL(val1));
2927 START(OBJE, $<ctxt>$)
2929 multim_obje_emb_subs
2930 { CHECK2(FORM,FILE) }
2932 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>4,
2937 multim_obje_emb_subs : /* empty */
2938 | multim_obje_emb_subs multim_obje_emb_sub
2941 multim_obje_emb_sub : multim_obje_form_sect { OCCUR2(FORM, 1, 1) }
2942 | multim_obje_titl_sect { OCCUR2(TITL, 0, 1) }
2943 | multim_obje_file_sect { OCCUR2(FILE, 1, 1) }
2948 multim_obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
2950 = start_element(ELT_SUB_MULTIM_OBJE_FORM,
2952 GEDCOM_MAKE_STRING(val1, $4));
2953 START(FORM, $<ctxt>$)
2958 { end_element(ELT_SUB_MULTIM_OBJE_FORM,
2959 PARENT, $<ctxt>5, NULL);
2962 multim_obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
2964 = start_element(ELT_SUB_MULTIM_OBJE_TITL,
2966 GEDCOM_MAKE_STRING(val1, $4));
2967 START(TITL, $<ctxt>$)
2972 { end_element(ELT_SUB_MULTIM_OBJE_TITL,
2973 PARENT, $<ctxt>5, NULL);
2976 multim_obje_file_sect : OPEN DELIM TAG_FILE mand_line_item
2978 = start_element(ELT_SUB_MULTIM_OBJE_FILE,
2980 GEDCOM_MAKE_STRING(val1, $4));
2981 START(FILE, $<ctxt>$)
2986 { end_element(ELT_SUB_MULTIM_OBJE_FILE,
2987 PARENT, $<ctxt>5, NULL);
2991 /* NOTE STRUCTURE */
2992 note_struc_sub : note_struc_link_sect /* 0:M */
2993 | note_struc_emb_sect /* 0:M */
2996 note_struc_link_sect : OPEN DELIM TAG_NOTE DELIM POINTER
2997 { struct xref_value *xr = gedcom_parse_xref($5,
3000 if (xr == NULL) HANDLE_ERROR;
3002 = start_element(ELT_SUB_NOTE,
3004 GEDCOM_MAKE_XREF_PTR(val1, xr));
3005 START(NOTE, $<ctxt>$)
3007 note_struc_link_subs
3010 { end_element(ELT_SUB_NOTE, PARENT, $<ctxt>6, NULL);
3014 note_struc_link_subs : /* empty */
3015 | note_struc_link_subs note_struc_link_sub
3018 note_struc_link_sub : source_cit_sub
3022 note_struc_emb_sect : OPEN DELIM TAG_NOTE opt_line_item
3024 = start_element(ELT_SUB_NOTE,
3026 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
3027 START(NOTE, $<ctxt>$)
3032 { end_element(ELT_SUB_NOTE, PARENT, $<ctxt>5, NULL);
3036 note_struc_emb_subs : /* empty */
3037 | note_struc_emb_subs note_struc_emb_sub
3040 note_struc_emb_sub : continuation_sub
3045 /* PERSONAL NAME STRUCTURE */
3046 pers_name_struc_sub : pers_name_sect /* 0:M */
3049 pers_name_sect : OPEN DELIM TAG_NAME mand_line_item
3050 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME,
3052 GEDCOM_MAKE_STRING(val1, $4));
3053 START(NAME, $<ctxt>$)
3058 { end_element(ELT_SUB_PERS_NAME, PARENT, $<ctxt>5, NULL);
3062 pers_name_subs : /* empty */
3063 | pers_name_subs pers_name_sub
3066 pers_name_sub : pers_name_npfx_sect { OCCUR2(NPFX, 0, 1) }
3067 | pers_name_givn_sect { OCCUR2(GIVN, 0, 1) }
3068 | pers_name_nick_sect { OCCUR2(NICK, 0, 1) }
3069 | pers_name_spfx_sect { OCCUR2(SPFX, 0, 1) }
3070 | pers_name_surn_sect { OCCUR2(SURN, 0, 1) }
3071 | pers_name_nsfx_sect { OCCUR2(NSFX, 0, 1) }
3077 pers_name_npfx_sect : OPEN DELIM TAG_NPFX mand_line_item
3078 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NPFX,
3080 GEDCOM_MAKE_STRING(val1, $4));
3081 START(NPFX, $<ctxt>$)
3086 { end_element(ELT_SUB_PERS_NAME_NPFX, PARENT, $<ctxt>5,
3090 pers_name_givn_sect : OPEN DELIM TAG_GIVN mand_line_item
3091 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_GIVN,
3093 GEDCOM_MAKE_STRING(val1, $4));
3094 START(GIVN, $<ctxt>$)
3099 { end_element(ELT_SUB_PERS_NAME_GIVN, PARENT, $<ctxt>5,
3103 pers_name_nick_sect : OPEN DELIM TAG_NICK mand_line_item
3104 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NICK,
3106 GEDCOM_MAKE_STRING(val1, $4));
3107 START(NICK, $<ctxt>$)
3112 { end_element(ELT_SUB_PERS_NAME_NICK, PARENT, $<ctxt>5,
3116 pers_name_spfx_sect : OPEN DELIM TAG_SPFX mand_line_item
3117 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SPFX,
3119 GEDCOM_MAKE_STRING(val1, $4));
3120 START(SPFX, $<ctxt>$)
3125 { end_element(ELT_SUB_PERS_NAME_SPFX, PARENT, $<ctxt>5,
3129 pers_name_surn_sect : OPEN DELIM TAG_SURN mand_line_item
3130 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SURN,
3132 GEDCOM_MAKE_STRING(val1, $4));
3133 START(SURN, $<ctxt>$)
3138 { end_element(ELT_SUB_PERS_NAME_SURN, PARENT, $<ctxt>5,
3142 pers_name_nsfx_sect : OPEN DELIM TAG_NSFX mand_line_item
3143 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NSFX,
3145 GEDCOM_MAKE_STRING(val1, $4));
3146 START(NSFX, $<ctxt>$)
3151 { end_element(ELT_SUB_PERS_NAME_NSFX, PARENT, $<ctxt>5,
3156 /* PLACE STRUCTURE */
3157 place_struc_sub : place_struc_plac_sect /* 0:M */
3160 place_struc_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
3162 = start_element(ELT_SUB_PLAC,
3164 GEDCOM_MAKE_STRING(val1, $4));
3165 START(PLAC, $<ctxt>$)
3167 place_struc_plac_subs
3170 { end_element(ELT_SUB_PLAC, PARENT, $<ctxt>5, NULL);
3174 place_struc_plac_subs : /* empty */
3175 | place_struc_plac_subs place_struc_plac_sub
3178 place_struc_plac_sub : place_plac_form_sect { OCCUR2(FORM, 0, 1) }
3184 place_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
3186 = start_element(ELT_SUB_PLAC_FORM,
3188 GEDCOM_MAKE_STRING(val1, $4));
3189 START(FORM, $<ctxt>$)
3194 { end_element(ELT_SUB_PLAC_FORM, PARENT, $<ctxt>5,
3199 /* SOURCE_CITATION */
3200 source_cit_sub : source_cit_link_sect /* 0:M */
3201 | source_cit_emb_sect /* 0:M */
3204 source_cit_link_sect : OPEN DELIM TAG_SOUR DELIM POINTER
3205 { struct xref_value *xr = gedcom_parse_xref($5,
3208 if (xr == NULL) HANDLE_ERROR;
3210 = start_element(ELT_SUB_SOUR,
3212 GEDCOM_MAKE_XREF_PTR(val1, xr));
3213 START(SOUR, $<ctxt>$)
3215 source_cit_link_subs
3218 { end_element(ELT_SUB_SOUR, PARENT, $<ctxt>6, NULL);
3222 source_cit_link_subs : /* empty */
3223 | source_cit_link_subs source_cit_link_sub
3226 source_cit_link_sub : source_cit_page_sect { OCCUR2(PAGE, 0, 1) }
3227 | source_cit_even_sect { OCCUR2(EVEN, 0, 1) }
3228 | source_cit_data_sect { OCCUR2(DATA, 0, 1) }
3229 | source_cit_quay_sect { OCCUR2(QUAY, 0, 1) }
3235 source_cit_page_sect : OPEN DELIM TAG_PAGE mand_line_item
3237 = start_element(ELT_SUB_SOUR_PAGE,
3239 GEDCOM_MAKE_STRING(val1, $4));
3240 START(PAGE, $<ctxt>$)
3245 { end_element(ELT_SUB_SOUR_PAGE, PARENT, $<ctxt>5,
3250 source_cit_even_sect : OPEN DELIM TAG_EVEN mand_line_item
3252 = start_element(ELT_SUB_SOUR_EVEN,
3254 GEDCOM_MAKE_STRING(val1, $4));
3255 START(EVEN, $<ctxt>$)
3257 source_cit_even_subs
3260 { end_element(ELT_SUB_SOUR_EVEN, PARENT, $<ctxt>5,
3265 source_cit_even_subs : /* empty */
3266 | source_cit_even_subs source_cit_even_sub
3269 source_cit_even_sub : source_cit_even_role_sect { OCCUR2(ROLE, 0, 1) }
3273 source_cit_even_role_sect : OPEN DELIM TAG_ROLE mand_line_item
3275 = start_element(ELT_SUB_SOUR_EVEN_ROLE,
3277 GEDCOM_MAKE_STRING(val1, $4));
3278 START(ROLE, $<ctxt>$)
3283 { end_element(ELT_SUB_SOUR_EVEN_ROLE,
3284 PARENT, $<ctxt>5, NULL);
3288 source_cit_data_sect : OPEN DELIM TAG_DATA
3289 { $<ctxt>$ = start_element(ELT_SUB_SOUR_DATA,
3290 PARENT, $1, $3, NULL,
3291 GEDCOM_MAKE_NULL(val1));
3292 START(DATA, $<ctxt>$)
3294 source_cit_data_subs
3297 { end_element(ELT_SUB_SOUR_DATA, PARENT, $<ctxt>4,
3302 source_cit_data_subs : /* empty */
3303 | source_cit_data_subs source_cit_data_sub
3306 source_cit_data_sub : source_cit_data_date_sect { OCCUR2(DATE, 0, 1) }
3307 | source_cit_text_sect /* 0:M */
3311 source_cit_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
3312 { struct date_value dv = gedcom_parse_date($4);
3314 = start_element(ELT_SUB_SOUR_DATA_DATE,
3316 GEDCOM_MAKE_DATE(val1, dv));
3317 START(DATE, $<ctxt>$)
3322 { end_element(ELT_SUB_SOUR_DATA_DATE,
3323 PARENT, $<ctxt>5, NULL);
3327 source_cit_text_sect : OPEN DELIM TAG_TEXT mand_line_item
3329 = start_element(ELT_SUB_SOUR_TEXT,
3331 GEDCOM_MAKE_STRING(val1, $4));
3332 START(TEXT, $<ctxt>$)
3334 source_cit_text_subs
3337 { end_element(ELT_SUB_SOUR_TEXT, PARENT, $<ctxt>5,
3342 source_cit_text_subs : /* empty */
3343 | source_cit_text_subs source_cit_text_sub
3346 source_cit_text_sub : continuation_sub
3350 source_cit_quay_sect : OPEN DELIM TAG_QUAY mand_line_item
3352 = start_element(ELT_SUB_SOUR_QUAY,
3354 GEDCOM_MAKE_STRING(val1, $4));
3355 START(QUAY, $<ctxt>$)
3360 { end_element(ELT_SUB_SOUR_QUAY, PARENT, $<ctxt>5,
3365 source_cit_emb_sect : OPEN DELIM TAG_SOUR mand_line_item
3366 { $<ctxt>$ = start_element(ELT_SUB_SOUR,
3368 GEDCOM_MAKE_STRING(val1, $4));
3369 START(SOUR, $<ctxt>$)
3374 { end_element(ELT_SUB_SOUR, PARENT, $<ctxt>5, NULL);
3378 source_cit_emb_subs : /* empty */
3379 | source_cit_emb_subs source_cit_emb_sub
3382 source_cit_emb_sub : continuation_sub
3383 | source_cit_text_sect /* 0:M */
3388 /* SOURCE REPOSITORY CITATION */
3389 source_repos_cit_sub : source_repos_repo_sect { OCCUR2(REPO, 0, 1) }
3392 source_repos_repo_sect : OPEN DELIM TAG_REPO mand_pointer
3393 { struct xref_value *xr
3394 = gedcom_parse_xref($4, XREF_USED, XREF_REPO);
3395 if (xr == NULL) HANDLE_ERROR;
3397 = start_element(ELT_SUB_REPO,
3399 GEDCOM_MAKE_XREF_PTR(val1, xr));
3400 START(REPO, $<ctxt>$)
3402 source_repos_repo_subs
3405 { end_element(ELT_SUB_REPO, PARENT, $<ctxt>5, NULL);
3409 source_repos_repo_subs : /* empty */
3410 | source_repos_repo_subs source_repos_repo_sub
3413 source_repos_repo_sub : note_struc_sub
3414 | caln_sect /* 0:M */
3418 caln_sect : OPEN DELIM TAG_CALN mand_line_item
3419 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN,
3421 GEDCOM_MAKE_STRING(val1, $4));
3422 START(CALN, $<ctxt>$)
3427 { end_element(ELT_SUB_REPO_CALN, PARENT, $<ctxt>5, NULL);
3431 caln_subs : /* empty */
3432 | caln_subs caln_sub
3435 caln_sub : caln_medi_sect { OCCUR2(MEDI, 0, 1) }
3439 caln_medi_sect : OPEN DELIM TAG_MEDI mand_line_item
3440 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN_MEDI,
3442 GEDCOM_MAKE_STRING(val1, $4));
3443 START(MEDI, $<ctxt>$)
3448 { end_element(ELT_SUB_REPO_CALN_MEDI, PARENT, $<ctxt>5, NULL);
3452 /* SPOUSE TO FAMILY LINK */
3453 spou_fam_link_sub : spou_fam_fams_sect /* 0:M */
3456 spou_fam_fams_sect : OPEN DELIM TAG_FAMS mand_pointer
3457 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
3459 if (xr == NULL) HANDLE_ERROR;
3461 = start_element(ELT_SUB_FAMS,
3463 GEDCOM_MAKE_XREF_PTR(val1, xr));
3464 START(FAMS, $<ctxt>$)
3469 { end_element(ELT_SUB_FAMS, PARENT, $<ctxt>5, NULL);
3473 spou_fam_fams_subs : /* empty */
3474 | spou_fam_fams_subs spou_fam_fams_sub
3477 spou_fam_fams_sub : note_struc_sub
3481 /*********************************************************************/
3483 /*********************************************************************/
3485 no_std_subs : /* empty */
3486 | no_std_subs no_std_sub
3489 no_std_sub : user_sect /* 0:M */
3491 | error error_subs CLOSE { HANDLE_ERROR }
3494 no_std_rec : user_rec /* 0:M */
3496 | error error_subs CLOSE { HANDLE_ERROR }
3499 user_rec : OPEN DELIM opt_xref USERTAG
3500 { if ($4.string[0] != '_') {
3501 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3507 { struct xref_value *xr = NULL;
3509 xr = gedcom_parse_xref($3, XREF_DEFINED, XREF_USER);
3510 if (xr == NULL) HANDLE_ERROR;
3512 $<ctxt>$ = start_record(REC_USER,
3514 GEDCOM_MAKE_NULL_OR_XREF_PTR(val1, xr),
3521 { end_record(REC_USER, $<ctxt>7); }
3523 user_sect : OPEN DELIM opt_xref USERTAG
3524 { if ($4.string[0] != '_') {
3525 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3531 { $<ctxt>$ = start_element(ELT_USER, PARENT, $1, $4, $6, &val2);
3532 START($4, $<ctxt>$);
3537 { end_element(ELT_USER, PARENT, $<ctxt>7, NULL);
3541 user_sects : /* empty */ { }
3542 | user_sects user_sect { }
3545 opt_xref : /* empty */ { $$ = NULL; }
3546 | POINTER DELIM { $$ = $1; }
3549 opt_value : /* empty */ { GEDCOM_MAKE_NULL(val2);
3551 | DELIM POINTER { struct xref_value *xr
3552 = gedcom_parse_xref($2, XREF_USED,
3554 GEDCOM_MAKE_XREF_PTR(val2, xr);
3556 | DELIM line_item { GEDCOM_MAKE_STRING(val2, $2);
3560 mand_pointer : /* empty */ { gedcom_error(_("Missing pointer")); YYERROR; }
3561 | DELIM POINTER { gedcom_debug_print("==Ptr: %s==", $2);
3565 mand_line_item : /* empty */
3566 { if (compat_mode(C_LIFELINES)) {
3567 /* Lifelines tends to not care about mandatory values */
3568 gedcom_debug_print("==Val: ==");
3572 gedcom_error(_("Missing value")); YYERROR;
3575 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3579 opt_line_item : /* empty */ { $$ = NULL; }
3580 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3584 line_item : anychar { size_t i;
3585 CLEAR_BUFFER(line_item_buf);
3586 line_item_buf_ptr = line_item_buf;
3587 /* The following also takes care of '@@' */
3588 if (!strncmp($1, "@@", 3))
3589 *line_item_buf_ptr++ = '@';
3591 for (i=0; i < strlen($1); i++)
3592 *line_item_buf_ptr++ = $1[i];
3595 | ESCAPE { size_t i;
3596 CLEAR_BUFFER(line_item_buf);
3597 line_item_buf_ptr = line_item_buf;
3598 for (i=0; i < strlen($1); i++)
3599 *line_item_buf_ptr++ = $1[i];
3604 /* The following also takes care of '@@' */
3605 if (!strncmp($2, "@@", 3))
3606 *line_item_buf_ptr++ = '@';
3608 for (i=0; i < strlen($2); i++)
3609 *line_item_buf_ptr++ = $2[i];
3614 for (i=0; i < strlen($2); i++)
3615 *line_item_buf_ptr++ = $2[i];
3620 anychar : ANYCHAR { }
3624 error_subs : /* empty */
3625 | error_subs error_sect
3628 error_sect : OPEN DELIM opt_xref anytag opt_value error_subs CLOSE { }
3630 gen_sect : OPEN DELIM opt_xref anystdtag
3631 { INVALID_TAG($4.string); }
3632 opt_value opt_sects CLOSE
3636 gen_rec : gen_rec_top
3640 gen_rec_norm : OPEN DELIM opt_xref anystdtag
3641 { INVALID_TOP_TAG($4.string) }
3642 opt_value opt_sects CLOSE
3646 gen_rec_top : OPEN DELIM anytoptag
3647 { gedcom_error(_("Missing cross-reference")); YYERROR; }
3648 opt_value opt_sects CLOSE
3652 opt_sects : /* empty */ { }
3653 | opt_sects gen_sect { }
3656 anytag : USERTAG { }
3670 anystdtag : TAG_ABBR
3800 /* Functions that handle the counting of subtags */
3802 int* count_arrays[MAXGEDCLEVEL+1];
3803 char tag_stack[MAXGEDCLEVEL+1][MAXSTDTAGLEN+1];
3804 Gedcom_ctxt ctxt_stack[MAXGEDCLEVEL+1];
3806 void push_countarray()
3809 if (count_level > MAXGEDCLEVEL) {
3810 gedcom_error(_("Internal error: count array overflow"));
3814 count = (int *)calloc(YYNTOKENS, sizeof(int));
3815 if (count == NULL) {
3816 gedcom_error(_("Internal error: count array calloc error"));
3820 count_arrays[count_level] = count;
3825 void set_parenttag(char* tag)
3827 strncpy(tag_stack[count_level+1], tag, MAXSTDTAGLEN+1);
3830 void set_parentctxt(Gedcom_ctxt ctxt)
3832 ctxt_stack[count_level+1] = ctxt;
3835 char* get_parenttag(int offset)
3837 return tag_stack[count_level - offset];
3840 Gedcom_ctxt get_parentctxt(int offset)
3842 return ctxt_stack[count_level - offset];
3845 int count_tag(int tag)
3847 int *count = count_arrays[count_level];
3848 return ++count[tag - GEDCOMTAGOFFSET];
3851 int check_occurrence(int tag)
3853 int *count = count_arrays[count_level];
3854 return (count[tag - GEDCOMTAGOFFSET] > 0);
3857 void pop_countarray()
3860 if (count_level < 0) {
3861 gedcom_error(_("Internal error: count array underflow"));
3865 count = count_arrays[count_level];
3867 count_arrays[count_level] = NULL;
3871 /* Enabling debug mode */
3872 /* level 0: no debugging */
3873 /* level 1: only internal */
3874 /* level 2: also bison */
3877 void gedcom_set_debug_level(int level, FILE* f)
3882 trace_output = stderr;
3884 gedcom_high_level_debug = 1;
3893 int gedcom_debug_print(char* s, ...)
3896 if (gedcom_high_level_debug) {
3899 res = vfprintf(trace_output, s, ap);
3901 fprintf(trace_output, "\n");
3906 /* Setting the error mechanism */
3907 void gedcom_set_error_handling(Gedcom_err_mech mechanism)
3909 error_mechanism = mechanism;
3912 /* Compatibility handling */
3914 void gedcom_set_compat_handling(int enable_compat)
3916 compat_enabled = enable_compat;
3919 void set_compatibility(char* program)
3921 if (compat_enabled) {
3922 if (! strncmp(program, "ftree", 6)) {
3923 gedcom_warning(_("Enabling compatibility with 'ftree'"));
3924 compatibility = C_FTREE;
3926 else if (! strncmp(program, "LIFELINES", 9)) {
3927 /* Matches "LIFELINES 3.0.2" */
3928 gedcom_warning(_("Enabling compatibility with 'Lifelines'"));
3929 compatibility = C_LIFELINES;
3938 int compat_mode(int compat_flags)
3940 return (compat_flags & compatibility);