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;
168 /* These are defined at the bottom of the file */
169 void push_countarray();
170 void set_parenttag(char* tag);
171 char* get_parenttag(int offset);
172 void set_parentctxt(Gedcom_ctxt ctxt);
173 Gedcom_ctxt get_parentctxt(int offset);
174 void pop_countarray();
175 int count_tag(int tag);
176 int check_occurrence(int tag);
177 void set_compatibility(char* program);
178 int compat_mode(int flags);
180 #define CLEAR_BUFFER(BUF) \
181 memset(BUF, 0, sizeof(BUF));
183 #define HANDLE_ERROR \
184 { if (error_mechanism == IMMED_FAIL) { \
187 else if (error_mechanism == DEFER_FAIL) { \
190 else if (error_mechanism == IGNORE_ERRORS) { \
194 #define START1(PARENTTAG) \
195 { set_parenttag(#PARENTTAG); \
197 #define START2(PARENTCTXT) \
198 { set_parentctxt(PARENTCTXT); \
202 #define START(PARENTTAG,PARENTCTXT) \
203 { START1(PARENTTAG); \
204 START2(PARENTCTXT); \
208 #define GRANDPARENT(OFF) \
211 { if (!check_occurrence(TAG_##TAG)) { \
212 char* parenttag = get_parenttag(0); \
213 gedcom_error(_("The tag '%s' is mandatory within '%s', but missing"),\
219 { pop_countarray(); \
223 #define CHECK1(TAG1) { CHK(TAG1); POP; }
224 #define CHECK2(TAG1,TAG2) \
225 { CHK(TAG1); CHK(TAG2); POP; }
226 #define CHECK3(TAG1,TAG2,TAG3) \
227 { CHK(TAG1); CHK(TAG2); CHK(TAG3); POP; }
228 #define CHECK4(TAG1,TAG2,TAG3,TAG4) \
229 { CHK(TAG1); CHK(TAG2); CHK(TAG3); CHK(TAG4); POP; }
230 #define OCCUR1(CHILDTAG, MIN) { count_tag(TAG_##CHILDTAG); }
231 #define OCCUR2(CHILDTAG, MIN, MAX) \
232 { int num = count_tag(TAG_##CHILDTAG); \
234 char* parenttag = get_parenttag(0); \
235 gedcom_error(_("The tag '%s' can maximally occur %d time(s) within '%s'"), \
236 #CHILDTAG, MAX, parenttag); \
240 #define INVALID_TAG(CHILDTAG) \
241 { char* parenttag = get_parenttag(0); \
242 gedcom_error(_("The tag '%s' is not a valid tag within '%s'"), \
243 CHILDTAG, parenttag); \
246 #define INVALID_TOP_TAG(CHILDTAG) \
247 { gedcom_error(_("The tag '%s' is not a valid top-level tag"), \
257 struct tag_struct tag;
264 %token <string> BADTOKEN
266 %token <string> CLOSE
267 %token <string> ESCAPE
268 %token <string> DELIM
269 %token <string> ANYCHAR
270 %token <string> POINTER
272 %token <tag> TAG_ABBR
273 %token <tag> TAG_ADDR
274 %token <tag> TAG_ADR1
275 %token <tag> TAG_ADR2
276 %token <tag> TAG_ADOP
279 %token <tag> TAG_AGNC
280 %token <tag> TAG_ALIA
281 %token <tag> TAG_ANCE
282 %token <tag> TAG_ANCI
283 %token <tag> TAG_ANUL
284 %token <tag> TAG_ASSO
285 %token <tag> TAG_AUTH
286 %token <tag> TAG_BAPL
287 %token <tag> TAG_BAPM
288 %token <tag> TAG_BARM
289 %token <tag> TAG_BASM
290 %token <tag> TAG_BIRT
291 %token <tag> TAG_BLES
292 %token <tag> TAG_BLOB
293 %token <tag> TAG_BURI
294 %token <tag> TAG_CALN
295 %token <tag> TAG_CAST
296 %token <tag> TAG_CAUS
297 %token <tag> TAG_CENS
298 %token <tag> TAG_CHAN
299 %token <tag> TAG_CHAR
300 %token <tag> TAG_CHIL
302 %token <tag> TAG_CHRA
303 %token <tag> TAG_CITY
304 %token <tag> TAG_CONC
305 %token <tag> TAG_CONF
306 %token <tag> TAG_CONL
307 %token <tag> TAG_CONT
308 %token <tag> TAG_COPR
309 %token <tag> TAG_CORP
310 %token <tag> TAG_CREM
311 %token <tag> TAG_CTRY
312 %token <tag> TAG_DATA
313 %token <tag> TAG_DATE
314 %token <tag> TAG_DEAT
315 %token <tag> TAG_DESC
316 %token <tag> TAG_DESI
317 %token <tag> TAG_DEST
319 %token <tag> TAG_DIVF
320 %token <tag> TAG_DSCR
321 %token <tag> TAG_EDUC
322 %token <tag> TAG_EMIG
323 %token <tag> TAG_ENDL
324 %token <tag> TAG_ENGA
325 %token <tag> TAG_EVEN
327 %token <tag> TAG_FAMC
328 %token <tag> TAG_FAMF
329 %token <tag> TAG_FAMS
330 %token <tag> TAG_FCOM
331 %token <tag> TAG_FILE
332 %token <tag> TAG_FORM
333 %token <tag> TAG_GEDC
334 %token <tag> TAG_GIVN
335 %token <tag> TAG_GRAD
336 %token <tag> TAG_HEAD
337 %token <tag> TAG_HUSB
338 %token <tag> TAG_IDNO
339 %token <tag> TAG_IMMI
340 %token <tag> TAG_INDI
341 %token <tag> TAG_LANG
342 %token <tag> TAG_LEGA
343 %token <tag> TAG_MARB
344 %token <tag> TAG_MARC
345 %token <tag> TAG_MARL
346 %token <tag> TAG_MARR
347 %token <tag> TAG_MARS
348 %token <tag> TAG_MEDI
349 %token <tag> TAG_NAME
350 %token <tag> TAG_NATI
351 %token <tag> TAG_NATU
352 %token <tag> TAG_NCHI
353 %token <tag> TAG_NICK
355 %token <tag> TAG_NOTE
356 %token <tag> TAG_NPFX
357 %token <tag> TAG_NSFX
358 %token <tag> TAG_OBJE
359 %token <tag> TAG_OCCU
360 %token <tag> TAG_ORDI
361 %token <tag> TAG_ORDN
362 %token <tag> TAG_PAGE
363 %token <tag> TAG_PEDI
364 %token <tag> TAG_PHON
365 %token <tag> TAG_PLAC
366 %token <tag> TAG_POST
367 %token <tag> TAG_PROB
368 %token <tag> TAG_PROP
369 %token <tag> TAG_PUBL
370 %token <tag> TAG_QUAY
371 %token <tag> TAG_REFN
372 %token <tag> TAG_RELA
373 %token <tag> TAG_RELI
374 %token <tag> TAG_REPO
375 %token <tag> TAG_RESI
376 %token <tag> TAG_RESN
377 %token <tag> TAG_RETI
380 %token <tag> TAG_ROLE
382 %token <tag> TAG_SLGC
383 %token <tag> TAG_SLGS
384 %token <tag> TAG_SOUR
385 %token <tag> TAG_SPFX
387 %token <tag> TAG_STAE
388 %token <tag> TAG_STAT
389 %token <tag> TAG_SUBM
390 %token <tag> TAG_SUBN
391 %token <tag> TAG_SURN
392 %token <tag> TAG_TEMP
393 %token <tag> TAG_TEXT
394 %token <tag> TAG_TIME
395 %token <tag> TAG_TITL
396 %token <tag> TAG_TRLR
397 %token <tag> TAG_TYPE
398 %token <tag> TAG_VERS
399 %token <tag> TAG_WIFE
400 %token <tag> TAG_WILL
402 %type <tag> anystdtag
403 %type <tag> anytoptag
404 %type <tag> fam_event_tag
405 %type <tag> indiv_attr_tag
406 %type <tag> indiv_birt_tag
407 %type <tag> indiv_gen_tag
408 %type <tag> lio_bapl_tag
409 %type <string> line_item
410 %type <string> mand_line_item
411 %type <string> mand_pointer
412 %type <string> note_line_item
413 %type <string> anychar
414 %type <string> opt_xref
415 %type <string> opt_value
416 %type <string> opt_line_item
417 %type <ctxt> head_sect
421 file : head_sect records trlr_sect
422 { if (fail == 1) YYABORT; }
427 records : /* empty */
442 /*********************************************************************/
444 /*********************************************************************/
445 head_sect : OPEN DELIM TAG_HEAD
446 { $<ctxt>$ = start_record(REC_HEAD, $1, GEDCOM_MAKE_NULL(val1),
448 NULL, GEDCOM_MAKE_NULL(val2));
449 START(HEAD, $<ctxt>$) }
451 { if (compat_mode(C_FTREE)) {
452 CHECK3(SOUR, GEDC, CHAR);
453 compat_generate_submitter_link($<ctxt>4);
456 CHECK4(SOUR, SUBM, GEDC, CHAR)
459 { end_record(REC_HEAD, $<ctxt>4);
460 if (compat_mode(C_FTREE))
461 compat_generate_submitter();
465 head_subs : /* empty */
469 head_sub : head_sour_sect { OCCUR2(SOUR, 1, 1) }
470 | head_dest_sect { OCCUR2(DEST, 0, 1) }
471 | head_date_sect { OCCUR2(DATE, 0, 1) }
472 | head_subm_sect { OCCUR2(SUBM, 1, 1) }
473 | head_subn_sect { OCCUR2(SUBN, 0, 1) }
474 | head_file_sect { OCCUR2(FILE, 0, 1) }
475 | head_copr_sect { OCCUR2(COPR, 0, 1) }
476 | head_gedc_sect { OCCUR2(GEDC, 1, 1) }
477 | head_char_sect { OCCUR2(CHAR, 1, 1) }
478 | head_lang_sect { OCCUR2(LANG, 0, 1) }
479 | head_plac_sect { OCCUR2(PLAC, 0, 1) }
480 | head_note_sect { OCCUR2(NOTE, 0, 1) }
485 head_sour_sect : OPEN DELIM TAG_SOUR mand_line_item
486 { set_compatibility($4);
487 $<ctxt>$ = start_element(ELT_HEAD_SOUR, PARENT,
489 GEDCOM_MAKE_STRING(val1, $4));
490 START(SOUR, $<ctxt>$)
495 { end_element(ELT_HEAD_SOUR, PARENT, $<ctxt>5, NULL); }
498 head_sour_subs : /* empty */
499 | head_sour_subs head_sour_sub
502 head_sour_sub : head_sour_vers_sect { OCCUR2(VERS, 0, 1) }
503 | head_sour_name_sect { OCCUR2(NAME, 0, 1) }
504 | head_sour_corp_sect { OCCUR2(CORP, 0, 1) }
505 | head_sour_data_sect { OCCUR2(DATA, 0, 1) }
509 head_sour_vers_sect : OPEN DELIM TAG_VERS mand_line_item
510 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_VERS, PARENT,
512 GEDCOM_MAKE_STRING(val1, $4));
513 START(VERS, $<ctxt>$)
518 { end_element(ELT_HEAD_SOUR_VERS,
519 PARENT, $<ctxt>5, NULL);
522 head_sour_name_sect : OPEN DELIM TAG_NAME mand_line_item
523 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_NAME, PARENT,
525 GEDCOM_MAKE_STRING(val1, $4));
526 START(NAME, $<ctxt>$)
531 { end_element(ELT_HEAD_SOUR_NAME,
532 PARENT, $<ctxt>5, NULL);
535 head_sour_corp_sect : OPEN DELIM TAG_CORP mand_line_item
536 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_CORP, PARENT,
538 GEDCOM_MAKE_STRING(val1, $4));
539 START(CORP, $<ctxt>$)
544 { end_element(ELT_HEAD_SOUR_CORP,
545 PARENT, $<ctxt>5, NULL);
549 head_sour_corp_subs : /* empty */
550 | head_sour_corp_subs head_sour_corp_sub
553 head_sour_corp_sub : addr_struc_sub /* 0:1 */
557 head_sour_data_sect : OPEN DELIM TAG_DATA mand_line_item
558 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_DATA, PARENT,
560 GEDCOM_MAKE_STRING(val1, $4));
561 START(DATA, $<ctxt>$)
566 { end_element(ELT_HEAD_SOUR_DATA,
567 PARENT, $<ctxt>5, NULL);
571 head_sour_data_subs : /* empty */
572 | head_sour_data_subs head_sour_data_sub
575 head_sour_data_sub : head_sour_data_date_sect { OCCUR2(DATE, 0, 1) }
576 | head_sour_data_copr_sect { OCCUR2(COPR, 0, 1) }
580 head_sour_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
581 { struct date_value dv = gedcom_parse_date($4);
583 = start_element(ELT_HEAD_SOUR_DATA_DATE,
585 GEDCOM_MAKE_DATE(val1, dv));
586 START(DATE, $<ctxt>$)
591 { end_element(ELT_HEAD_SOUR_DATA_DATE,
592 PARENT, $<ctxt>5, NULL);
595 head_sour_data_copr_sect : OPEN DELIM TAG_COPR mand_line_item
597 = start_element(ELT_HEAD_SOUR_DATA_COPR,
599 GEDCOM_MAKE_STRING(val1, $4));
600 START(COPR, $<ctxt>$)
605 { end_element(ELT_HEAD_SOUR_DATA_COPR,
606 PARENT, $<ctxt>5, NULL);
611 head_dest_sect : OPEN DELIM TAG_DEST mand_line_item
612 { $<ctxt>$ = start_element(ELT_HEAD_DEST,
614 GEDCOM_MAKE_STRING(val1, $4));
615 START(DEST, $<ctxt>$)
620 { end_element(ELT_HEAD_DEST,
621 PARENT, $<ctxt>5, NULL);
626 head_date_sect : OPEN DELIM TAG_DATE mand_line_item
627 { struct date_value dv = gedcom_parse_date($4);
628 $<ctxt>$ = start_element(ELT_HEAD_DATE,
630 GEDCOM_MAKE_DATE(val1, dv));
631 START(DATE, $<ctxt>$)
636 { end_element(ELT_HEAD_DATE,
637 PARENT, $<ctxt>5, NULL);
641 head_date_subs : /* empty */
642 | head_date_subs head_date_sub
645 head_date_sub : head_date_time_sect { OCCUR2(TIME, 0, 1) }
649 head_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
650 { $<ctxt>$ = start_element(ELT_HEAD_DATE_TIME,
652 GEDCOM_MAKE_STRING(val1, $4));
653 START(TIME, $<ctxt>$)
658 { end_element(ELT_HEAD_DATE_TIME,
659 PARENT, $<ctxt>5, NULL);
664 head_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
665 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
667 if (xr == NULL) HANDLE_ERROR;
668 $<ctxt>$ = start_element(ELT_HEAD_SUBM,
670 GEDCOM_MAKE_XREF_PTR(val1, xr));
671 START(SUBM, $<ctxt>$)
676 { end_element(ELT_HEAD_SUBM,
677 PARENT, $<ctxt>5, NULL);
681 head_subn_sect : OPEN DELIM TAG_SUBN 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_SUBN,
687 GEDCOM_MAKE_XREF_PTR(val1, xr));
688 START(SUBN, $<ctxt>$)
693 { end_element(ELT_HEAD_SUBN,
694 PARENT, $<ctxt>5, NULL);
698 head_file_sect : OPEN DELIM TAG_FILE mand_line_item
699 { $<ctxt>$ = start_element(ELT_HEAD_FILE,
701 GEDCOM_MAKE_STRING(val1, $4));
702 START(FILE, $<ctxt>$)
707 { end_element(ELT_HEAD_FILE, PARENT, $<ctxt>5, NULL);
711 head_copr_sect : OPEN DELIM TAG_COPR mand_line_item
712 { $<ctxt>$ = start_element(ELT_HEAD_COPR,
714 GEDCOM_MAKE_STRING(val1, $4));
715 START(COPR, $<ctxt>$)
720 { end_element(ELT_HEAD_COPR, PARENT, $<ctxt>5, NULL);
724 head_gedc_sect : OPEN DELIM TAG_GEDC
725 { $<ctxt>$ = start_element(ELT_HEAD_GEDC,
726 PARENT, $1, $3, NULL,
727 GEDCOM_MAKE_NULL(val1));
728 START(GEDC, $<ctxt>$)
731 { CHECK2(VERS, FORM) }
733 { end_element(ELT_HEAD_GEDC, PARENT, $<ctxt>4, NULL);
737 head_gedc_subs : /* empty */
738 | head_gedc_subs head_gedc_sub
741 head_gedc_sub : head_gedc_vers_sect { OCCUR2(VERS, 1, 1) }
742 | head_gedc_form_sect { OCCUR2(FORM, 1, 1) }
745 head_gedc_vers_sect : OPEN DELIM TAG_VERS mand_line_item
746 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_VERS,
748 GEDCOM_MAKE_STRING(val1, $4));
749 START(VERS, $<ctxt>$)
754 { end_element(ELT_HEAD_GEDC_VERS,
755 PARENT, $<ctxt>5, NULL);
758 head_gedc_form_sect : OPEN DELIM TAG_FORM mand_line_item
759 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_FORM,
761 GEDCOM_MAKE_STRING(val1, $4));
762 START(FORM, $<ctxt>$)
767 { end_element(ELT_HEAD_GEDC_FORM,
768 PARENT, $<ctxt>5, NULL);
773 head_char_sect : OPEN DELIM TAG_CHAR mand_line_item
774 { /* Don't allow to continue if conversion context couldn't
776 if (open_conv_to_internal($4) == 0) YYABORT;
777 $<ctxt>$ = start_element(ELT_HEAD_CHAR,
779 GEDCOM_MAKE_STRING(val1, $4));
780 START(CHAR, $<ctxt>$)
785 { end_element(ELT_HEAD_CHAR, PARENT, $<ctxt>5, NULL);
789 head_char_subs : /* empty */
790 | head_char_subs head_char_sub
793 head_char_sub : head_char_vers_sect { OCCUR2(VERS, 0, 1) }
796 head_char_vers_sect : OPEN DELIM TAG_VERS mand_line_item
797 { $<ctxt>$ = start_element(ELT_HEAD_CHAR_VERS,
799 GEDCOM_MAKE_STRING(val1, $4));
800 START(VERS, $<ctxt>$)
805 { end_element(ELT_HEAD_CHAR_VERS,
806 PARENT, $<ctxt>5, NULL);
811 head_lang_sect : OPEN DELIM TAG_LANG mand_line_item
812 { $<ctxt>$ = start_element(ELT_HEAD_LANG,
814 GEDCOM_MAKE_STRING(val1, $4));
815 START(LANG, $<ctxt>$)
820 { end_element(ELT_HEAD_LANG, PARENT, $<ctxt>5, NULL);
824 head_plac_sect : OPEN DELIM TAG_PLAC
825 { $<ctxt>$ = start_element(ELT_HEAD_PLAC,
826 PARENT, $1, $3, NULL,
827 GEDCOM_MAKE_NULL(val1));
828 START(PLAC, $<ctxt>$)
833 { end_element(ELT_HEAD_PLAC, PARENT, $<ctxt>4, NULL);
837 head_plac_subs : /* empty */
838 | head_plac_subs head_plac_sub
841 head_plac_sub : head_plac_form_sect { OCCUR2(FORM, 1, 1) }
844 head_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
845 { $<ctxt>$ = start_element(ELT_HEAD_PLAC_FORM,
847 GEDCOM_MAKE_STRING(val1, $4));
848 START(FORM, $<ctxt>$)
853 { end_element(ELT_HEAD_PLAC_FORM,
854 PARENT, $<ctxt>5, NULL);
859 head_note_sect : OPEN DELIM TAG_NOTE mand_line_item
860 { $<ctxt>$ = start_element(ELT_HEAD_NOTE,
862 GEDCOM_MAKE_STRING(val1, $4));
863 START(NOTE, $<ctxt>$)
868 { end_element(ELT_HEAD_NOTE, PARENT, $<ctxt>5, NULL);
872 head_note_subs : /* empty */
873 | head_note_subs head_note_sub
876 head_note_sub : continuation_sub /* 0:M */
880 /*********************************************************************/
882 /*********************************************************************/
883 /* Don't need callbacks here, there is no information... */
884 trlr_sect : OPEN DELIM TAG_TRLR CLOSE { }
887 /*********************************************************************/
888 /**** Family record ****/
889 /*********************************************************************/
890 fam_rec : OPEN DELIM POINTER DELIM TAG_FAM
891 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
893 if (xr == NULL) HANDLE_ERROR;
894 $<ctxt>$ = start_record(REC_FAM,
895 $1, GEDCOM_MAKE_XREF_PTR(val1, xr),
897 NULL, GEDCOM_MAKE_NULL(val2));
898 START(FAM, $<ctxt>$) }
902 { end_record(REC_FAM, $<ctxt>6); }
905 fam_subs : /* empty */
909 fam_sub : fam_event_struc_sub /* 0:M */
910 | fam_husb_sect { OCCUR2(HUSB, 0, 1) }
911 | fam_wife_sect { OCCUR2(WIFE, 0, 1) }
912 | fam_chil_sect /* 0:M */
913 | fam_nchi_sect { OCCUR2(NCHI, 0, 1) }
914 | fam_subm_sect /* 0:M */
915 | lds_spouse_seal_sub /* 0:M */
916 | source_cit_sub /* 0:M */
917 | multim_link_sub /* 0:M */
918 | note_struc_sub /* 0:M */
919 | ident_struc_sub /* 0:1 */
920 | change_date_sub /* 0:1 */
925 fam_husb_sect : OPEN DELIM TAG_HUSB mand_pointer
926 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
928 if (xr == NULL) HANDLE_ERROR;
929 $<ctxt>$ = start_element(ELT_FAM_HUSB,
931 GEDCOM_MAKE_XREF_PTR(val1, xr));
932 START(HUSB, $<ctxt>$)
937 { end_element(ELT_FAM_HUSB, PARENT, $<ctxt>5, NULL);
942 fam_wife_sect : OPEN DELIM TAG_WIFE 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_WIFE,
948 GEDCOM_MAKE_XREF_PTR(val1, xr));
949 START(WIFE, $<ctxt>$)
954 { end_element(ELT_FAM_WIFE, PARENT, $<ctxt>5, NULL);
959 fam_chil_sect : OPEN DELIM TAG_CHIL 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_CHIL,
965 GEDCOM_MAKE_XREF_PTR(val1, xr));
966 START(CHIL, $<ctxt>$)
971 { end_element(ELT_FAM_CHIL, PARENT, $<ctxt>5, NULL);
976 fam_nchi_sect : OPEN DELIM TAG_NCHI mand_line_item
977 { $<ctxt>$ = start_element(ELT_FAM_NCHI,
979 GEDCOM_MAKE_STRING(val1, $4));
980 START(NCHI, $<ctxt>$)
985 { end_element(ELT_FAM_NCHI, PARENT, $<ctxt>5, NULL);
990 fam_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
991 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
993 if (xr == NULL) HANDLE_ERROR;
994 $<ctxt>$ = start_element(ELT_FAM_SUBM,
996 GEDCOM_MAKE_XREF_PTR(val1, xr));
997 START(SUBM, $<ctxt>$)
1002 { end_element(ELT_FAM_SUBM, PARENT, $<ctxt>5, NULL);
1006 /*********************************************************************/
1007 /**** Individual record ****/
1008 /*********************************************************************/
1009 indiv_rec : OPEN DELIM POINTER DELIM TAG_INDI
1010 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1012 if (xr == NULL) HANDLE_ERROR;
1013 $<ctxt>$ = start_record(REC_INDI,
1014 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1015 NULL, GEDCOM_MAKE_NULL(val2));
1016 START(INDI, $<ctxt>$) }
1020 { end_record(REC_INDI, $<ctxt>6); }
1023 indi_subs : /* empty */
1024 | indi_subs indi_sub
1027 indi_sub : indi_resn_sect { OCCUR2(RESN, 0, 1) }
1028 | pers_name_struc_sub /* 0:M */
1029 | indi_sex_sect { OCCUR2(SEX, 0, 1) }
1030 | indiv_even_struc_sub /* 0:M */
1031 | indiv_attr_struc_sub /* 0:M */
1032 | lds_indiv_ord_sub /* 0:M */
1033 | chi_fam_link_sub /* 0:M */
1034 | spou_fam_link_sub /* 0:M */
1035 | indi_subm_sect /* 0:M */
1036 | assoc_struc_sub /* 0:M */
1037 | indi_alia_sect /* 0:M */
1038 | indi_anci_sect /* 0:M */
1039 | indi_desi_sect /* 0:M */
1040 | source_cit_sub /* 0:M */
1041 | multim_link_sub /* 0:M */
1042 | note_struc_sub /* 0:M */
1043 | indi_rfn_sect { OCCUR2(RFN, 0, 1) }
1044 | indi_afn_sect /* 0:M */
1045 | ident_struc_sub /* 0:1 */
1046 | change_date_sub /* 0:1 */
1047 | ftree_addr_sect { if (!compat_mode(C_FTREE))
1048 INVALID_TAG("ADDR");
1054 indi_resn_sect : OPEN DELIM TAG_RESN mand_line_item
1055 { $<ctxt>$ = start_element(ELT_INDI_RESN,
1057 GEDCOM_MAKE_STRING(val1, $4));
1058 START(RESN, $<ctxt>$)
1063 { end_element(ELT_INDI_RESN, PARENT, $<ctxt>5, NULL);
1068 indi_sex_sect : OPEN DELIM TAG_SEX mand_line_item
1069 { $<ctxt>$ = start_element(ELT_INDI_SEX,
1071 GEDCOM_MAKE_STRING(val1, $4));
1072 START(SEX, $<ctxt>$)
1077 { end_element(ELT_INDI_SEX, PARENT, $<ctxt>5, NULL);
1082 indi_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1083 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1085 if (xr == NULL) HANDLE_ERROR;
1086 $<ctxt>$ = start_element(ELT_INDI_SUBM,
1088 GEDCOM_MAKE_XREF_PTR(val1, xr));
1089 START(SUBM, $<ctxt>$)
1094 { end_element(ELT_INDI_SUBM, PARENT, $<ctxt>5, NULL);
1099 indi_alia_sect : OPEN DELIM TAG_ALIA 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_ALIA,
1105 GEDCOM_MAKE_XREF_PTR(val1, xr));
1106 START(ALIA, $<ctxt>$)
1111 { end_element(ELT_INDI_ALIA, PARENT, $<ctxt>5, NULL);
1116 indi_anci_sect : OPEN DELIM TAG_ANCI 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_ANCI,
1122 GEDCOM_MAKE_XREF_PTR(val1, xr));
1123 START(ANCI, $<ctxt>$)
1128 { end_element(ELT_INDI_ANCI, PARENT, $<ctxt>5, NULL);
1133 indi_desi_sect : OPEN DELIM TAG_DESI 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_DESI,
1139 GEDCOM_MAKE_XREF_PTR(val1, xr));
1140 START(DESI, $<ctxt>$)
1145 { end_element(ELT_INDI_DESI, PARENT, $<ctxt>5, NULL);
1150 indi_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1151 { $<ctxt>$ = start_element(ELT_INDI_RFN,
1153 GEDCOM_MAKE_STRING(val1, $4));
1154 START(RFN, $<ctxt>$)
1159 { end_element(ELT_INDI_RFN, PARENT, $<ctxt>5, NULL);
1164 indi_afn_sect : OPEN DELIM TAG_AFN mand_line_item
1165 { $<ctxt>$ = start_element(ELT_INDI_AFN,
1167 GEDCOM_MAKE_STRING(val1, $4));
1168 START(AFN, $<ctxt>$)
1173 { end_element(ELT_INDI_AFN, PARENT, $<ctxt>5, NULL);
1177 /* INDI.ADDR (Only for 'ftree' compatibility) */
1178 ftree_addr_sect : OPEN DELIM TAG_ADDR opt_line_item
1179 { if (compat_mode(C_FTREE)) {
1180 Gedcom_ctxt par = compat_generate_resi_start(PARENT);
1183 = start_element(ELT_SUB_ADDR,
1184 par, $1 + 1, $3, $4,
1185 GEDCOM_MAKE_NULL_OR_STRING(val2, $4));
1186 START(ADDR, $<ctxt>$);
1188 else { START(ADDR, NULL) }
1193 { if (compat_mode(C_FTREE)) {
1194 Gedcom_ctxt par = PARENT;
1195 end_element(ELT_SUB_ADDR, par, $<ctxt>5, NULL);
1197 compat_generate_resi_end(PARENT, par);
1201 ftree_addr_subs : /* empty */
1202 | ftree_addr_subs ftree_addr_sub
1205 ftree_addr_sub : continuation_sub
1206 | ftree_addr_phon_sect
1210 ftree_addr_phon_sect : OPEN DELIM TAG_PHON mand_line_item
1212 = start_element(ELT_SUB_PHON,
1213 GRANDPARENT(1), $1, $3, $4,
1214 GEDCOM_MAKE_STRING(val1, $4));
1215 START(PHON, $<ctxt>$)
1220 { end_element(ELT_SUB_PHON, GRANDPARENT(1),
1225 /*********************************************************************/
1226 /**** Multimedia record ****/
1227 /*********************************************************************/
1228 multim_rec : OPEN DELIM POINTER DELIM TAG_OBJE
1229 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1231 if (xr == NULL) HANDLE_ERROR;
1232 $<ctxt>$ = start_record(REC_OBJE,
1233 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1234 NULL, GEDCOM_MAKE_NULL(val2));
1235 START(OBJE, $<ctxt>$) }
1237 { CHECK2(FORM, BLOB) }
1239 { end_record(REC_OBJE, $<ctxt>6); }
1242 obje_subs : /* empty */
1243 | obje_subs obje_sub
1246 obje_sub : obje_form_sect { OCCUR2(FORM, 1, 1) }
1247 | obje_titl_sect { OCCUR2(TITL, 0, 1) }
1248 | note_struc_sub /* 0:M */
1249 | obje_blob_sect { OCCUR2(BLOB, 1, 1) }
1250 | obje_obje_sect { OCCUR2(OBJE, 0, 1) }
1251 | ident_struc_sub /* 0:1 */
1252 | change_date_sub /* 0:1 */
1257 obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
1258 { $<ctxt>$ = start_element(ELT_OBJE_FORM,
1260 GEDCOM_MAKE_STRING(val1, $4));
1261 START(FORM, $<ctxt>$)
1266 { end_element(ELT_OBJE_FORM, PARENT, $<ctxt>5, NULL);
1271 obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1272 { $<ctxt>$ = start_element(ELT_OBJE_TITL,
1274 GEDCOM_MAKE_STRING(val1, $4));
1275 START(TITL, $<ctxt>$)
1280 { end_element(ELT_OBJE_TITL, PARENT, $<ctxt>5, NULL);
1285 obje_blob_sect : OPEN DELIM TAG_BLOB
1286 { $<ctxt>$ = start_element(ELT_OBJE_BLOB,
1287 PARENT, $1, $3, NULL,
1288 GEDCOM_MAKE_NULL(val1));
1289 START(BLOB, $<ctxt>$)
1294 { end_element(ELT_OBJE_BLOB, PARENT, $<ctxt>4, NULL);
1298 obje_blob_subs : /* empty */
1299 | obje_blob_subs obje_blob_sub
1302 obje_blob_sub : obje_blob_cont_sect { OCCUR1(CONT, 1) }
1306 obje_blob_cont_sect : OPEN DELIM TAG_CONT mand_line_item
1307 { $<ctxt>$ = start_element(ELT_OBJE_BLOB_CONT,
1309 GEDCOM_MAKE_STRING(val1, $4));
1310 START(CONT, $<ctxt>$)
1315 { end_element(ELT_OBJE_BLOB_CONT, PARENT,
1321 obje_obje_sect : OPEN DELIM TAG_OBJE mand_pointer
1322 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1324 if (xr == NULL) HANDLE_ERROR;
1325 $<ctxt>$ = start_element(ELT_OBJE_OBJE,
1327 GEDCOM_MAKE_XREF_PTR(val1, xr));
1328 START(OBJE, $<ctxt>$)
1333 { end_element(ELT_OBJE_OBJE, PARENT, $<ctxt>5, NULL);
1337 /*********************************************************************/
1338 /**** Note record ****/
1339 /*********************************************************************/
1340 note_rec : OPEN DELIM POINTER DELIM TAG_NOTE note_line_item
1341 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1343 if (xr == NULL) HANDLE_ERROR;
1344 $<ctxt>$ = start_record(REC_NOTE,
1345 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1346 $6, GEDCOM_MAKE_STRING(val2, $6));
1347 START(NOTE, $<ctxt>$) }
1351 { end_record(REC_NOTE, $<ctxt>7); }
1354 note_line_item : /* empty */
1355 { if (!compat_mode(C_FTREE)) {
1356 gedcom_error(_("Missing value")); YYERROR;
1363 { gedcom_debug_print("==Val: %s==", $2);
1367 note_subs : /* empty */
1368 | note_subs note_sub
1371 note_sub : continuation_sub /* 0:M */
1372 | source_cit_sub /* 0:M */
1373 | ident_struc_sub /* 0:1 */
1374 | change_date_sub /* 0:1 */
1378 /*********************************************************************/
1379 /**** Repository record ****/
1380 /*********************************************************************/
1381 repos_rec : OPEN DELIM POINTER DELIM TAG_REPO
1382 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1384 if (xr == NULL) HANDLE_ERROR;
1385 $<ctxt>$ = start_record(REC_REPO,
1386 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1387 NULL, GEDCOM_MAKE_NULL(val2));
1388 START(REPO, $<ctxt>$) }
1392 { end_record(REC_REPO, $<ctxt>6); }
1395 repo_subs : /* empty */
1396 | repo_subs repo_sub
1399 repo_sub : repo_name_sect { OCCUR2(NAME, 0, 1) }
1400 | addr_struc_sub /* 0:1 */
1401 | note_struc_sub /* 0:M */
1402 | ident_struc_sub /* 0:1 */
1403 | change_date_sub /* 0:1 */
1408 repo_name_sect : OPEN DELIM TAG_NAME mand_line_item
1409 { $<ctxt>$ = start_element(ELT_REPO_NAME,
1411 GEDCOM_MAKE_STRING(val1, $4));
1412 START(NAME, $<ctxt>$)
1417 { end_element(ELT_REPO_NAME, PARENT, $<ctxt>5, NULL);
1421 /*********************************************************************/
1422 /**** Source record ****/
1423 /*********************************************************************/
1424 source_rec : OPEN DELIM POINTER DELIM TAG_SOUR
1425 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1427 if (xr == NULL) HANDLE_ERROR;
1428 $<ctxt>$ = start_record(REC_SOUR,
1429 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1430 NULL, GEDCOM_MAKE_NULL(val2));
1431 START(SOUR, $<ctxt>$) }
1435 { end_record(REC_SOUR, $<ctxt>6); }
1438 sour_subs : /* empty */
1439 | sour_subs sour_sub
1442 sour_sub : sour_data_sect { OCCUR2(DATA, 0, 1) }
1443 | sour_auth_sect { OCCUR2(AUTH, 0, 1) }
1444 | sour_titl_sect { OCCUR2(TITL, 0, 1) }
1445 | sour_abbr_sect { OCCUR2(ABBR, 0, 1) }
1446 | sour_publ_sect { OCCUR2(PUBL, 0, 1) }
1447 | sour_text_sect { OCCUR2(TEXT, 0, 1) }
1448 | source_repos_cit_sub /* 0:1 */
1449 | multim_link_sub /* 0:M */
1450 | note_struc_sub /* 0:M */
1451 | ident_struc_sub /* 0:1 */
1452 | change_date_sub /* 0:1 */
1457 sour_data_sect : OPEN DELIM TAG_DATA
1458 { $<ctxt>$ = start_element(ELT_SOUR_DATA,
1459 PARENT, $1, $3, NULL,
1460 GEDCOM_MAKE_NULL(val1));
1461 START(DATA, $<ctxt>$)
1466 { end_element(ELT_SOUR_DATA, PARENT, $<ctxt>4, NULL);
1470 sour_data_subs : /* empty */
1471 | sour_data_subs sour_data_sub
1474 sour_data_sub : sour_data_even_sect /* 0:M */
1475 | sour_data_agnc_sect { OCCUR2(AGNC, 0, 1) }
1476 | note_struc_sub /* 0:M */
1480 sour_data_even_sect : OPEN DELIM TAG_EVEN mand_line_item
1481 { $<ctxt>$ = start_element(ELT_SOUR_DATA_EVEN,
1483 GEDCOM_MAKE_STRING(val1, $4));
1484 START(EVEN, $<ctxt>$)
1489 { end_element(ELT_SOUR_DATA_EVEN, PARENT,
1494 sour_data_even_subs : /* empty */
1495 | sour_data_even_subs sour_data_even_sub
1498 sour_data_even_sub : sour_data_even_date_sect { OCCUR2(DATE, 0, 1) }
1499 | sour_data_even_plac_sect { OCCUR2(PLAC, 0, 1) }
1503 sour_data_even_date_sect : OPEN DELIM TAG_DATE mand_line_item
1504 { struct date_value dv = gedcom_parse_date($4);
1506 = start_element(ELT_SOUR_DATA_EVEN_DATE,
1508 GEDCOM_MAKE_DATE(val1, dv));
1509 START(DATE, $<ctxt>$)
1514 { end_element(ELT_SOUR_DATA_EVEN_DATE, PARENT,
1519 sour_data_even_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
1521 = start_element(ELT_SOUR_DATA_EVEN_PLAC,
1523 GEDCOM_MAKE_STRING(val1, $4));
1524 START(PLAC, $<ctxt>$)
1529 { end_element(ELT_SOUR_DATA_EVEN_PLAC, PARENT,
1534 sour_data_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
1535 { $<ctxt>$ = start_element(ELT_SOUR_DATA_AGNC,
1537 GEDCOM_MAKE_STRING(val1, $4));
1538 START(AGNC, $<ctxt>$)
1543 { end_element(ELT_SOUR_DATA_AGNC, PARENT,
1549 sour_auth_sect : OPEN DELIM TAG_AUTH mand_line_item
1550 { $<ctxt>$ = start_element(ELT_SOUR_AUTH,
1552 GEDCOM_MAKE_STRING(val1, $4));
1553 START(AUTH, $<ctxt>$)
1558 { end_element(ELT_SOUR_AUTH, PARENT, $<ctxt>5, NULL);
1562 sour_auth_subs : /* empty */
1563 | sour_auth_subs sour_auth_sub
1566 sour_auth_sub : continuation_sub /* 0:M */
1571 sour_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1572 { $<ctxt>$ = start_element(ELT_SOUR_TITL,
1574 GEDCOM_MAKE_STRING(val1, $4));
1575 START(TITL, $<ctxt>$)
1580 { end_element(ELT_SOUR_TITL, PARENT, $<ctxt>5, NULL);
1584 sour_titl_subs : /* empty */
1585 | sour_titl_subs sour_titl_sub
1588 sour_titl_sub : continuation_sub /* 0:M */
1593 sour_abbr_sect : OPEN DELIM TAG_ABBR mand_line_item
1594 { $<ctxt>$ = start_element(ELT_SOUR_ABBR,
1596 GEDCOM_MAKE_STRING(val1, $4));
1597 START(ABBR, $<ctxt>$)
1602 { end_element(ELT_SOUR_ABBR, PARENT, $<ctxt>5, NULL);
1607 sour_publ_sect : OPEN DELIM TAG_PUBL mand_line_item
1608 { $<ctxt>$ = start_element(ELT_SOUR_PUBL,
1610 GEDCOM_MAKE_STRING(val1, $4));
1611 START(PUBL, $<ctxt>$)
1616 { end_element(ELT_SOUR_PUBL, PARENT, $<ctxt>5, NULL);
1620 sour_publ_subs : /* empty */
1621 | sour_publ_subs sour_publ_sub
1624 sour_publ_sub : continuation_sub /* 0:M */
1629 sour_text_sect : OPEN DELIM TAG_TEXT mand_line_item
1630 { $<ctxt>$ = start_element(ELT_SOUR_TEXT,
1632 GEDCOM_MAKE_STRING(val1, $4));
1633 START(TEXT, $<ctxt>$)
1638 { end_element(ELT_SOUR_TEXT, PARENT, $<ctxt>5, NULL);
1642 sour_text_subs : /* empty */
1643 | sour_text_subs sour_text_sub
1646 sour_text_sub : continuation_sub /* 0:M */
1650 /*********************************************************************/
1651 /**** Submission record ****/
1652 /*********************************************************************/
1653 submis_rec : OPEN DELIM POINTER DELIM TAG_SUBN
1654 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1656 if (xr == NULL) HANDLE_ERROR;
1657 $<ctxt>$ = start_record(REC_SUBN,
1658 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1659 NULL, GEDCOM_MAKE_NULL(val2));
1660 START(SUBN, $<ctxt>$) }
1664 { end_record(REC_SUBN, $<ctxt>6); }
1667 subn_subs : /* empty */
1668 | subn_subs subn_sub
1671 subn_sub : subn_subm_sect { OCCUR2(SUBM, 0, 1) }
1672 | subn_famf_sect { OCCUR2(FAMF, 0, 1) }
1673 | subn_temp_sect { OCCUR2(TEMP, 0, 1) }
1674 | subn_ance_sect { OCCUR2(ANCE, 0, 1) }
1675 | subn_desc_sect { OCCUR2(DESC, 0, 1) }
1676 | subn_ordi_sect { OCCUR2(ORDI, 0, 1) }
1677 | subn_rin_sect { OCCUR2(RIN, 0, 1) }
1682 subn_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1683 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1685 if (xr == NULL) HANDLE_ERROR;
1686 $<ctxt>$ = start_element(ELT_SUBN_SUBM,
1688 GEDCOM_MAKE_XREF_PTR(val1, xr));
1689 START(SUBM, $<ctxt>$)
1694 { end_element(ELT_SUBN_SUBM, PARENT, $<ctxt>5, NULL);
1699 subn_famf_sect : OPEN DELIM TAG_FAMF mand_line_item
1700 { $<ctxt>$ = start_element(ELT_SUBN_FAMF,
1702 GEDCOM_MAKE_STRING(val1, $4));
1703 START(FAMF, $<ctxt>$)
1708 { end_element(ELT_SUBN_FAMF, PARENT, $<ctxt>5, NULL);
1713 subn_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
1714 { $<ctxt>$ = start_element(ELT_SUBN_TEMP,
1716 GEDCOM_MAKE_STRING(val1, $4));
1717 START(TEMP, $<ctxt>$)
1722 { end_element(ELT_SUBN_TEMP, PARENT, $<ctxt>5, NULL);
1727 subn_ance_sect : OPEN DELIM TAG_ANCE mand_line_item
1728 { $<ctxt>$ = start_element(ELT_SUBN_ANCE,
1730 GEDCOM_MAKE_STRING(val1, $4));
1731 START(ANCE, $<ctxt>$)
1736 { end_element(ELT_SUBN_ANCE, PARENT, $<ctxt>5, NULL);
1741 subn_desc_sect : OPEN DELIM TAG_DESC mand_line_item
1742 { $<ctxt>$ = start_element(ELT_SUBN_DESC,
1744 GEDCOM_MAKE_STRING(val1, $4));
1745 START(DESC, $<ctxt>$)
1750 { end_element(ELT_SUBN_DESC, PARENT, $<ctxt>5, NULL);
1755 subn_ordi_sect : OPEN DELIM TAG_ORDI mand_line_item
1756 { $<ctxt>$ = start_element(ELT_SUBN_ORDI,
1758 GEDCOM_MAKE_STRING(val1, $4));
1759 START(ORDI, $<ctxt>$)
1764 { end_element(ELT_SUBN_ORDI, PARENT, $<ctxt>5, NULL);
1769 subn_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1770 { $<ctxt>$ = start_element(ELT_SUBN_RIN,
1772 GEDCOM_MAKE_STRING(val1, $4));
1773 START(RIN, $<ctxt>$)
1778 { end_element(ELT_SUBN_RIN, PARENT, $<ctxt>5, NULL);
1782 /*********************************************************************/
1783 /**** Submitter record ****/
1784 /*********************************************************************/
1785 submit_rec : OPEN DELIM POINTER DELIM TAG_SUBM
1786 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1788 if (xr == NULL) HANDLE_ERROR;
1789 $<ctxt>$ = start_record(REC_SUBM,
1790 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1791 NULL, GEDCOM_MAKE_NULL(val2));
1792 START(SUBM, $<ctxt>$) }
1796 { end_record(REC_SUBM, $<ctxt>6); }
1799 subm_subs : /* empty */
1800 | subm_subs subm_sub
1803 subm_sub : subm_name_sect { OCCUR2(NAME, 1, 1) }
1804 | addr_struc_sub /* 0:1 */
1805 | multim_link_sub /* 0:M */
1806 | subm_lang_sect { OCCUR2(LANG, 0, 3) }
1807 | subm_rfn_sect { OCCUR2(RFN, 0, 1) }
1808 | subm_rin_sect { OCCUR2(RIN, 0, 1) }
1809 | change_date_sub /* 0:1 */
1814 subm_name_sect : OPEN DELIM TAG_NAME mand_line_item
1815 { $<ctxt>$ = start_element(ELT_SUBM_NAME,
1817 GEDCOM_MAKE_STRING(val1, $4));
1818 START(NAME, $<ctxt>$)
1823 { end_element(ELT_SUBM_NAME, PARENT, $<ctxt>5, NULL);
1828 subm_lang_sect : OPEN DELIM TAG_LANG mand_line_item
1829 { $<ctxt>$ = start_element(ELT_SUBM_LANG,
1831 GEDCOM_MAKE_STRING(val1, $4));
1832 START(LANG, $<ctxt>$)
1837 { end_element(ELT_SUBM_LANG, PARENT, $<ctxt>5, NULL);
1842 subm_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1843 { $<ctxt>$ = start_element(ELT_SUBM_RFN,
1845 GEDCOM_MAKE_STRING(val1, $4));
1846 START(RFN, $<ctxt>$)
1851 { end_element(ELT_SUBM_RFN, PARENT, $<ctxt>5, NULL);
1856 subm_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1857 { $<ctxt>$ = start_element(ELT_SUBM_RIN,
1859 GEDCOM_MAKE_STRING(val1, $4));
1860 START(RIN, $<ctxt>$)
1865 { end_element(ELT_SUBM_RIN, PARENT, $<ctxt>5, NULL);
1869 /*********************************************************************/
1870 /**** Substructures ****/
1871 /*********************************************************************/
1873 /* ADDRESS STRUCTURE */
1874 addr_struc_sub : addr_sect { OCCUR2(ADDR, 0, 1) }
1875 | phon_sect { OCCUR2(PHON, 0, 3) }
1878 addr_sect : OPEN DELIM TAG_ADDR mand_line_item
1879 { $<ctxt>$ = start_element(ELT_SUB_ADDR,
1881 GEDCOM_MAKE_STRING(val1, $4));
1882 START(ADDR, $<ctxt>$)
1887 { end_element(ELT_SUB_ADDR, PARENT, $<ctxt>5, NULL);
1891 addr_subs : /* empty */
1892 | addr_subs addr_sub
1895 addr_sub : addr_cont_sect /* 0:M */
1896 | addr_adr1_sect { OCCUR2(ADR1, 0, 1) }
1897 | addr_adr2_sect { OCCUR2(ADR2, 0, 1) }
1898 | addr_city_sect { OCCUR2(CITY, 0, 1) }
1899 | addr_stae_sect { OCCUR2(STAE, 0, 1) }
1900 | addr_post_sect { OCCUR2(POST, 0, 1) }
1901 | addr_ctry_sect { OCCUR2(CTRY, 0, 1) }
1905 addr_cont_sect : OPEN DELIM TAG_CONT mand_line_item
1906 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CONT,
1908 GEDCOM_MAKE_STRING(val1, $4));
1909 START(CONT, $<ctxt>$)
1914 { end_element(ELT_SUB_ADDR_CONT, PARENT, $<ctxt>5, NULL);
1917 addr_adr1_sect : OPEN DELIM TAG_ADR1 mand_line_item
1918 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR1,
1920 GEDCOM_MAKE_STRING(val1, $4));
1921 START(ADR1, $<ctxt>$)
1926 { end_element(ELT_SUB_ADDR_ADR1, PARENT, $<ctxt>5, NULL);
1929 addr_adr2_sect : OPEN DELIM TAG_ADR2 mand_line_item
1930 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR2,
1932 GEDCOM_MAKE_STRING(val1, $4));
1933 START(ADR2, $<ctxt>$)
1938 { end_element(ELT_SUB_ADDR_ADR2, PARENT, $<ctxt>5, NULL);
1941 addr_city_sect : OPEN DELIM TAG_CITY mand_line_item
1942 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CITY,
1944 GEDCOM_MAKE_STRING(val1, $4));
1945 START(CITY, $<ctxt>$)
1950 { end_element(ELT_SUB_ADDR_CITY, PARENT, $<ctxt>5, NULL);
1953 addr_stae_sect : OPEN DELIM TAG_STAE mand_line_item
1954 { $<ctxt>$ = start_element(ELT_SUB_ADDR_STAE,
1956 GEDCOM_MAKE_STRING(val1, $4));
1957 START(STAE, $<ctxt>$)
1962 { end_element(ELT_SUB_ADDR_STAE, PARENT, $<ctxt>5, NULL);
1965 addr_post_sect : OPEN DELIM TAG_POST mand_line_item
1966 { $<ctxt>$ = start_element(ELT_SUB_ADDR_POST,
1968 GEDCOM_MAKE_STRING(val1, $4));
1969 START(POST, $<ctxt>$)
1974 { end_element(ELT_SUB_ADDR_POST, PARENT, $<ctxt>5, NULL);
1977 addr_ctry_sect : OPEN DELIM TAG_CTRY mand_line_item
1978 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CTRY,
1980 GEDCOM_MAKE_STRING(val1, $4));
1981 START(CTRY, $<ctxt>$)
1986 { end_element(ELT_SUB_ADDR_CTRY, PARENT, $<ctxt>5, NULL);
1990 phon_sect : OPEN DELIM TAG_PHON mand_line_item
1991 { $<ctxt>$ = start_element(ELT_SUB_PHON,
1993 GEDCOM_MAKE_STRING(val1, $4));
1994 START(PHON, $<ctxt>$)
1999 { end_element(ELT_SUB_PHON, PARENT, $<ctxt>5, NULL);
2003 /* ASSOCIATION STRUCTURE */
2004 assoc_struc_sub : asso_sect /* 0:M */
2007 asso_sect : OPEN DELIM TAG_ASSO mand_pointer
2008 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2010 if (xr == NULL) HANDLE_ERROR;
2011 $<ctxt>$ = start_element(ELT_SUB_ASSO,
2013 GEDCOM_MAKE_XREF_PTR(val1, xr));
2014 START(ASSO, $<ctxt>$)
2017 { CHECK2(TYPE,RELA) }
2019 { end_element(ELT_SUB_ASSO, PARENT, $<ctxt>5, NULL);
2023 asso_subs : /* empty */
2024 | asso_type_sect { OCCUR2(TYPE, 1, 1) }
2025 | asso_rela_sect { OCCUR2(RELA, 1, 1) }
2031 asso_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2032 { $<ctxt>$ = start_element(ELT_SUB_ASSO_TYPE,
2034 GEDCOM_MAKE_STRING(val1, $4));
2035 START(TYPE, $<ctxt>$)
2040 { end_element(ELT_SUB_ASSO_TYPE, PARENT, $<ctxt>5, NULL);
2044 asso_rela_sect : OPEN DELIM TAG_RELA mand_line_item
2045 { $<ctxt>$ = start_element(ELT_SUB_ASSO_RELA,
2047 GEDCOM_MAKE_STRING(val1, $4));
2048 START(RELA, $<ctxt>$)
2053 { end_element(ELT_SUB_ASSO_RELA, PARENT, $<ctxt>5, NULL);
2058 change_date_sub : change_date_chan_sect { OCCUR2(CHAN, 0, 1) }
2061 change_date_chan_sect : OPEN DELIM TAG_CHAN
2062 { $<ctxt>$ = start_element(ELT_SUB_CHAN,
2063 PARENT, $1, $3, NULL,
2064 GEDCOM_MAKE_NULL(val1));
2065 START(CHAN, $<ctxt>$)
2067 change_date_chan_subs
2070 { end_element(ELT_SUB_CHAN, PARENT, $<ctxt>4, NULL);
2074 change_date_chan_subs : /* empty */
2075 | change_date_chan_subs change_date_chan_sub
2078 change_date_chan_sub : change_date_date_sect { OCCUR2(DATE, 1, 1) }
2083 change_date_date_sect : OPEN DELIM TAG_DATE mand_line_item
2084 { struct date_value dv = gedcom_parse_date($4);
2085 $<ctxt>$ = start_element(ELT_SUB_CHAN_DATE,
2087 GEDCOM_MAKE_DATE(val1, dv));
2088 START(DATE, $<ctxt>$) }
2089 change_date_date_subs
2092 { end_element(ELT_SUB_CHAN_DATE, PARENT, $<ctxt>5,
2097 change_date_date_subs : /* empty */
2098 | change_date_date_subs change_date_date_sub
2101 change_date_date_sub : change_date_date_time_sect { OCCUR2(TIME, 0, 1) }
2105 change_date_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
2107 = start_element(ELT_SUB_CHAN_TIME,
2109 GEDCOM_MAKE_STRING(val1, $4));
2110 START(TIME, $<ctxt>$)
2115 { end_element(ELT_SUB_CHAN_TIME, PARENT, $<ctxt>5,
2120 /* CHILD TO FAMILY LINK */
2121 chi_fam_link_sub : famc_sect /* 0:M */
2124 famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2125 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2127 if (xr == NULL) HANDLE_ERROR;
2128 $<ctxt>$ = start_element(ELT_SUB_FAMC,
2130 GEDCOM_MAKE_XREF_PTR(val1, xr));
2131 START(FAMC, $<ctxt>$)
2136 { end_element(ELT_SUB_FAMC, PARENT, $<ctxt>5, NULL);
2140 famc_subs : /* empty */
2141 | famc_subs famc_sub
2144 famc_sub : famc_pedi_sect /* 0:M */
2149 famc_pedi_sect : OPEN DELIM TAG_PEDI mand_line_item
2150 { $<ctxt>$ = start_element(ELT_SUB_FAMC_PEDI,
2152 GEDCOM_MAKE_STRING(val1, $4));
2153 START(PEDI, $<ctxt>$)
2158 { end_element(ELT_SUB_FAMC_PEDI, PARENT, $<ctxt>5, NULL);
2162 /* CONTINUATION SUBSECTIONS */
2163 continuation_sub : cont_sect /* 0:M */
2164 | conc_sect /* 0:M */
2167 cont_sect : OPEN DELIM TAG_CONT mand_line_item
2168 { $<ctxt>$ = start_element(ELT_SUB_CONT,
2170 GEDCOM_MAKE_STRING(val1, $4));
2171 START(CONT, $<ctxt>$)
2176 { end_element(ELT_SUB_CONT, PARENT, $<ctxt>5, NULL);
2180 conc_sect : OPEN DELIM TAG_CONC mand_line_item
2181 { $<ctxt>$ = start_element(ELT_SUB_CONC,
2183 GEDCOM_MAKE_STRING(val1, $4));
2184 START(CONC, $<ctxt>$)
2189 { end_element(ELT_SUB_CONC, PARENT, $<ctxt>5, NULL);
2194 event_detail_sub : event_detail_type_sect { OCCUR2(TYPE, 0, 1) }
2195 | event_detail_date_sect { OCCUR2(DATE, 0, 1) }
2198 | event_detail_age_sect { OCCUR2(AGE, 0, 1) }
2199 | event_detail_agnc_sect { OCCUR2(AGNC, 0, 1) }
2200 | event_detail_caus_sect { OCCUR2(CAUS, 0, 1) }
2206 event_detail_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2208 = start_element(ELT_SUB_EVT_TYPE,
2210 GEDCOM_MAKE_STRING(val1, $4));
2211 START(TYPE, $<ctxt>$)
2216 { end_element(ELT_SUB_EVT_TYPE, PARENT, $<ctxt>5,
2220 event_detail_date_sect : OPEN DELIM TAG_DATE mand_line_item
2221 { struct date_value dv = gedcom_parse_date($4);
2223 = start_element(ELT_SUB_EVT_DATE,
2225 GEDCOM_MAKE_DATE(val1, dv));
2226 START(DATE, $<ctxt>$)
2231 { end_element(ELT_SUB_EVT_DATE, PARENT, $<ctxt>5,
2235 event_detail_age_sect : OPEN DELIM TAG_AGE mand_line_item
2237 = start_element(ELT_SUB_EVT_AGE,
2239 GEDCOM_MAKE_STRING(val1, $4));
2240 START(AGE, $<ctxt>$)
2245 { end_element(ELT_SUB_EVT_AGE, PARENT, $<ctxt>5,
2249 event_detail_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
2251 = start_element(ELT_SUB_EVT_AGNC,
2253 GEDCOM_MAKE_STRING(val1, $4));
2254 START(AGNC, $<ctxt>$)
2259 { end_element(ELT_SUB_EVT_AGNC, PARENT, $<ctxt>5,
2263 event_detail_caus_sect : OPEN DELIM TAG_CAUS mand_line_item
2265 = start_element(ELT_SUB_EVT_CAUS,
2267 GEDCOM_MAKE_STRING(val1, $4));
2268 START(CAUS, $<ctxt>$)
2273 { end_element(ELT_SUB_EVT_CAUS, PARENT, $<ctxt>5,
2278 /* FAMILY EVENT STRUCTURE */
2279 fam_event_struc_sub : fam_event_sect
2280 | fam_gen_even_sect /* 0:M */
2283 fam_event_sect : OPEN DELIM fam_event_tag opt_value
2285 = start_element(ELT_SUB_FAM_EVT,
2287 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2293 { end_element(ELT_SUB_FAM_EVT, PARENT, $<ctxt>5, NULL);
2297 fam_event_tag : TAG_ANUL { $$ = $1; START1(ANUL) }
2298 | TAG_CENS { $$ = $1; START1(CENS) }
2299 | TAG_DIV { $$ = $1; START1(DIV) }
2300 | TAG_DIVF { $$ = $1; START1(DIVF) }
2301 | TAG_ENGA { $$ = $1; START1(ENGA) }
2302 | TAG_MARR { $$ = $1; START1(MARR) }
2303 | TAG_MARB { $$ = $1; START1(MARB) }
2304 | TAG_MARC { $$ = $1; START1(MARC) }
2305 | TAG_MARL { $$ = $1; START1(MARL) }
2306 | TAG_MARS { $$ = $1; START1(MARS) }
2309 fam_event_subs : /* empty */
2310 | fam_event_subs fam_event_sub
2313 fam_event_sub : event_detail_sub
2314 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2315 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2319 fam_even_husb_sect : OPEN DELIM TAG_HUSB
2320 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_HUSB,
2321 PARENT, $1, $3, NULL,
2322 GEDCOM_MAKE_NULL(val1));
2323 START(HUSB, $<ctxt>$)
2328 { end_element(ELT_SUB_FAM_EVT_HUSB, PARENT, $<ctxt>4,
2333 fam_even_husb_subs : /* empty */
2334 | fam_even_husb_subs fam_even_husb_sub
2337 fam_even_husb_sub : fam_even_age_sect { OCCUR2(AGE, 1, 1) }
2341 fam_even_age_sect : OPEN DELIM TAG_AGE mand_line_item
2342 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_AGE,
2344 GEDCOM_MAKE_STRING(val1, $4));
2345 START(AGE, $<ctxt>$)
2350 { end_element(ELT_SUB_FAM_EVT_AGE, PARENT, $<ctxt>5,
2355 fam_even_wife_sect : OPEN DELIM TAG_WIFE
2356 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_WIFE,
2357 PARENT, $1, $3, NULL,
2358 GEDCOM_MAKE_NULL(val1));
2359 START(WIFE, $<ctxt>$)
2364 { end_element(ELT_SUB_FAM_EVT_WIFE, PARENT, $<ctxt>4,
2369 fam_gen_even_sect : OPEN DELIM TAG_EVEN
2370 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_EVEN,
2371 PARENT, $1, $3, NULL,
2372 GEDCOM_MAKE_NULL(val1));
2373 START(EVEN, $<ctxt>$)
2378 { end_element(ELT_SUB_FAM_EVT_EVEN, PARENT, $<ctxt>4,
2383 fam_gen_even_subs : /* empty */
2384 | fam_gen_even_subs fam_gen_even_sub
2387 fam_gen_even_sub : event_detail_sub
2388 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2389 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2393 /* IDENTIFICATION STRUCTURE */
2394 ident_struc_sub : ident_refn_sect /* 0:M */
2395 | ident_rin_sect { OCCUR2(RIN, 0, 1) }
2398 ident_refn_sect : OPEN DELIM TAG_REFN mand_line_item
2399 { $<ctxt>$ = start_element(ELT_SUB_IDENT_REFN,
2401 GEDCOM_MAKE_STRING(val1, $4));
2402 START(REFN, $<ctxt>$)
2407 { end_element(ELT_SUB_IDENT_REFN, PARENT, $<ctxt>5,
2412 ident_refn_subs : /* empty */
2413 | ident_refn_subs ident_refn_sub
2416 ident_refn_sub : ident_refn_type_sect { OCCUR2(TYPE, 0, 1) }
2420 ident_refn_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2422 = start_element(ELT_SUB_IDENT_REFN_TYPE,
2424 GEDCOM_MAKE_STRING(val1, $4));
2425 START(TYPE, $<ctxt>$)
2430 { end_element(ELT_SUB_IDENT_REFN_TYPE, PARENT, $<ctxt>5,
2435 ident_rin_sect : OPEN DELIM TAG_RIN mand_line_item
2436 { $<ctxt>$ = start_element(ELT_SUB_IDENT_RIN,
2438 GEDCOM_MAKE_STRING(val1, $4));
2439 START(RIN, $<ctxt>$)
2444 { end_element(ELT_SUB_IDENT_RIN, PARENT, $<ctxt>5,
2449 /* INDIVIDUAL ATTRIBUTE STRUCTURE */
2450 indiv_attr_struc_sub : indiv_attr_sect /* 0:M */
2451 | indiv_resi_sect /* 0:M */
2454 indiv_attr_sect : OPEN DELIM indiv_attr_tag mand_line_item
2455 { $<ctxt>$ = start_element(ELT_SUB_INDIV_ATTR,
2457 GEDCOM_MAKE_STRING(val1, $4));
2460 indiv_attr_event_subs
2463 { end_element(ELT_SUB_INDIV_ATTR, PARENT, $<ctxt>5, NULL);
2466 indiv_attr_tag : TAG_CAST { $$ = $1; START1(CAST) }
2467 | TAG_DSCR { $$ = $1; START1(DSCR) }
2468 | TAG_EDUC { $$ = $1; START1(EDUC) }
2469 | TAG_IDNO { $$ = $1; START1(IDNO) }
2470 | TAG_NATI { $$ = $1; START1(NATI) }
2471 | TAG_NCHI { $$ = $1; START1(NCHI) }
2472 | TAG_NMR { $$ = $1; START1(NMR) }
2473 | TAG_OCCU { $$ = $1; START1(OCCU) }
2474 | TAG_PROP { $$ = $1; START1(PROP) }
2475 | TAG_RELI { $$ = $1; START1(RELI) }
2476 | TAG_SSN { $$ = $1; START1(SSN) }
2477 | TAG_TITL { $$ = $1; START1(TITL) }
2479 indiv_resi_sect : OPEN DELIM TAG_RESI
2480 { $<ctxt>$ = start_element(ELT_SUB_INDIV_RESI,
2481 PARENT, $1, $3, NULL,
2482 GEDCOM_MAKE_NULL(val1));
2483 START(RESI, $<ctxt>$)
2485 indiv_attr_event_subs
2488 { end_element(ELT_SUB_INDIV_RESI, PARENT, $<ctxt>4, NULL);
2492 indiv_attr_event_subs : /* empty */
2493 | indiv_attr_event_subs indiv_attr_event_sub
2496 indiv_attr_event_sub : event_detail_sub
2500 /* INDIVIDUAL EVENT STRUCTURE */
2501 indiv_even_struc_sub : indiv_birt_sect
2503 | indiv_adop_sect /* 0:M */
2504 | indiv_even_sect /* 0:M */
2507 indiv_birt_sect : OPEN DELIM indiv_birt_tag opt_value
2509 = start_element(ELT_SUB_INDIV_BIRT,
2511 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2517 { end_element(ELT_SUB_INDIV_BIRT, PARENT, $<ctxt>5, NULL);
2521 indiv_birt_tag : TAG_BIRT { $$ = $1; START1(BIRT) }
2522 | TAG_CHR { $$ = $1; START1(CHR) }
2525 indiv_birt_subs : /* empty */
2526 | indiv_birt_subs indiv_birt_sub
2529 indiv_birt_sub : event_detail_sub
2530 | indiv_birt_famc_sect { OCCUR2(FAMC,0, 1) }
2534 indiv_birt_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2535 { struct xref_value *xr = gedcom_parse_xref($4,
2538 if (xr == NULL) HANDLE_ERROR;
2540 = start_element(ELT_SUB_INDIV_BIRT_FAMC,
2542 GEDCOM_MAKE_XREF_PTR(val1, xr));
2543 START(FAMC, $<ctxt>$)
2548 { end_element(ELT_SUB_INDIV_BIRT_FAMC, PARENT, $<ctxt>5,
2553 indiv_gen_sect : OPEN DELIM indiv_gen_tag opt_value
2555 = start_element(ELT_SUB_INDIV_GEN,
2557 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2563 { end_element(ELT_SUB_INDIV_GEN, PARENT, $<ctxt>5, NULL);
2567 indiv_gen_tag : TAG_DEAT { $$ = $1; START1(DEAT) }
2568 | TAG_BURI { $$ = $1; START1(BURI) }
2569 | TAG_CREM { $$ = $1; START1(CREM) }
2570 | TAG_BAPM { $$ = $1; START1(BAPM) }
2571 | TAG_BARM { $$ = $1; START1(BARM) }
2572 | TAG_BASM { $$ = $1; START1(BASM) }
2573 | TAG_BLES { $$ = $1; START1(BLES) }
2574 | TAG_CHRA { $$ = $1; START1(CHRA) }
2575 | TAG_CONF { $$ = $1; START1(CONF) }
2576 | TAG_FCOM { $$ = $1; START1(FCOM) }
2577 | TAG_ORDN { $$ = $1; START1(ORDN) }
2578 | TAG_NATU { $$ = $1; START1(NATU) }
2579 | TAG_EMIG { $$ = $1; START1(EMIG) }
2580 | TAG_IMMI { $$ = $1; START1(IMMI) }
2581 | TAG_CENS { $$ = $1; START1(CENS) }
2582 | TAG_PROB { $$ = $1; START1(PROB) }
2583 | TAG_WILL { $$ = $1; START1(WILL) }
2584 | TAG_GRAD { $$ = $1; START1(GRAD) }
2585 | TAG_RETI { $$ = $1; START1(RETI) }
2588 indiv_gen_subs : /* empty */
2589 | indiv_gen_subs indiv_gen_sub
2592 indiv_gen_sub : event_detail_sub
2596 indiv_adop_sect : OPEN DELIM TAG_ADOP opt_value
2598 = start_element(ELT_SUB_INDIV_ADOP,
2600 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2601 START(ADOP, $<ctxt>$) }
2605 { end_element(ELT_SUB_INDIV_ADOP, PARENT, $<ctxt>5, NULL);
2609 indiv_adop_subs : /* empty */
2610 | indiv_adop_subs indiv_adop_sub
2613 indiv_adop_sub : event_detail_sub
2614 | indiv_adop_famc_sect { OCCUR2(FAMC,0, 1) }
2618 indiv_adop_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2619 { struct xref_value *xr = gedcom_parse_xref($4,
2622 if (xr == NULL) HANDLE_ERROR;
2624 = start_element(ELT_SUB_INDIV_ADOP_FAMC,
2626 GEDCOM_MAKE_XREF_PTR(val1, xr));
2627 START(FAMC, $<ctxt>$) }
2628 indiv_adop_famc_subs
2631 { end_element(ELT_SUB_INDIV_ADOP_FAMC, PARENT, $<ctxt>5,
2636 indiv_adop_famc_subs : /* empty */
2637 | indiv_adop_famc_subs indiv_adop_famc_sub
2640 indiv_adop_famc_sub : indiv_adop_famc_adop_sect { OCCUR2(ADOP,0, 1) }
2644 indiv_adop_famc_adop_sect : OPEN DELIM TAG_ADOP mand_line_item
2646 = start_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2648 GEDCOM_MAKE_STRING(val1, $4));
2649 START(ADOP, $<ctxt>$) }
2653 { end_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2654 PARENT, $<ctxt>5, NULL);
2658 indiv_even_sect : OPEN DELIM TAG_EVEN
2659 { $<ctxt>$ = start_element(ELT_SUB_INDIV_EVEN,
2660 PARENT, $1, $3, NULL,
2661 GEDCOM_MAKE_NULL(val1));
2662 START(EVEN, $<ctxt>$) }
2666 { end_element(ELT_SUB_INDIV_EVEN, PARENT, $<ctxt>4, NULL);
2670 /* LDS INDIVIDUAL ORDINANCE */
2671 lds_indiv_ord_sub : lio_bapl_sect /* 0:M */
2672 | lio_slgc_sect /* 0:M */
2675 lio_bapl_sect : OPEN DELIM lio_bapl_tag
2676 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL,
2677 PARENT, $1, $3, NULL,
2678 GEDCOM_MAKE_NULL(val1));
2684 { end_element(ELT_SUB_LIO_BAPL, PARENT, $<ctxt>4, NULL);
2688 lio_bapl_tag : TAG_BAPL { $$ = $1; START1(BAPL) }
2689 | TAG_CONL { $$ = $1; START1(CONL) }
2690 | TAG_ENDL { $$ = $1; START1(ENDL) }
2693 lio_bapl_subs : /* empty */
2694 | lio_bapl_subs lio_bapl_sub
2697 lio_bapl_sub : lio_bapl_stat_sect { OCCUR2(STAT, 0, 1) }
2698 | lio_bapl_date_sect { OCCUR2(DATE, 0, 1) }
2699 | lio_bapl_temp_sect { OCCUR2(TEMP, 0, 1) }
2700 | lio_bapl_plac_sect { OCCUR2(PLAC, 0, 1) }
2706 lio_bapl_stat_sect : OPEN DELIM TAG_STAT mand_line_item
2707 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_STAT,
2709 GEDCOM_MAKE_STRING(val1, $4));
2710 START(STAT, $<ctxt>$)
2715 { end_element(ELT_SUB_LIO_BAPL_STAT, PARENT, $<ctxt>5,
2719 lio_bapl_date_sect : OPEN DELIM TAG_DATE mand_line_item
2720 { struct date_value dv = gedcom_parse_date($4);
2721 $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_DATE,
2723 GEDCOM_MAKE_DATE(val1, dv));
2724 START(DATE, $<ctxt>$)
2729 { end_element(ELT_SUB_LIO_BAPL_DATE, PARENT, $<ctxt>5,
2733 lio_bapl_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
2734 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_TEMP,
2736 GEDCOM_MAKE_STRING(val1, $4));
2737 START(TEMP, $<ctxt>$)
2742 { end_element(ELT_SUB_LIO_BAPL_TEMP, PARENT, $<ctxt>5,
2746 lio_bapl_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
2747 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_PLAC,
2749 GEDCOM_MAKE_STRING(val1, $4));
2750 START(PLAC, $<ctxt>$)
2755 { end_element(ELT_SUB_LIO_BAPL_PLAC, PARENT, $<ctxt>5,
2760 lio_slgc_sect : OPEN DELIM TAG_SLGC
2761 { $<ctxt>$ = start_element(ELT_SUB_LIO_SLGC,
2762 PARENT, $1, $3, NULL,
2763 GEDCOM_MAKE_NULL(val1));
2764 START(SLGC, $<ctxt>$)
2769 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4, NULL);
2773 lio_slgc_subs : /* empty */
2774 | lio_slgc_subs lio_slgc_sub
2777 lio_slgc_sub : lio_bapl_sub
2778 | lio_slgc_famc_sect { OCCUR2(FAMC, 1, 1) }
2781 lio_slgc_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2782 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2784 if (xr == NULL) HANDLE_ERROR;
2786 = start_element(ELT_SUB_LIO_SLGC_FAMC,
2788 GEDCOM_MAKE_XREF_PTR(val1, xr));
2789 START(FAMC, $<ctxt>$)
2794 { end_element(ELT_SUB_LIO_SLGC_FAMC, PARENT, $<ctxt>5,
2799 /* LDS SPOUSE SEALING */
2800 lds_spouse_seal_sub : lss_slgs_sect
2803 lss_slgs_sect : OPEN DELIM TAG_SLGS
2804 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS,
2805 PARENT, $1, $3, NULL,
2806 GEDCOM_MAKE_NULL(val1));
2807 START(SLGS, $<ctxt>$) }
2811 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4, NULL);
2815 lss_slgs_subs : /* empty */
2816 | lss_slgs_subs lss_slgs_sub
2819 lss_slgs_sub : lss_slgs_stat_sect { OCCUR2(STAT, 0, 1) }
2820 | lss_slgs_date_sect { OCCUR2(DATE, 0, 1) }
2821 | lss_slgs_temp_sect { OCCUR2(TEMP, 0, 1) }
2822 | lss_slgs_plac_sect { OCCUR2(PLAC, 0, 1) }
2828 lss_slgs_stat_sect : OPEN DELIM TAG_STAT mand_line_item
2829 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_STAT,
2831 GEDCOM_MAKE_STRING(val1, $4));
2832 START(STAT, $<ctxt>$)
2837 { end_element(ELT_SUB_LSS_SLGS_STAT, PARENT, $<ctxt>5,
2841 lss_slgs_date_sect : OPEN DELIM TAG_DATE mand_line_item
2842 { struct date_value dv = gedcom_parse_date($4);
2843 $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_DATE,
2845 GEDCOM_MAKE_DATE(val1, dv));
2846 START(DATE, $<ctxt>$)
2851 { end_element(ELT_SUB_LSS_SLGS_DATE, PARENT, $<ctxt>5,
2855 lss_slgs_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
2856 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_TEMP,
2858 GEDCOM_MAKE_STRING(val1, $4));
2859 START(TEMP, $<ctxt>$)
2864 { end_element(ELT_SUB_LSS_SLGS_TEMP, PARENT, $<ctxt>5,
2868 lss_slgs_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
2869 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_PLAC,
2871 GEDCOM_MAKE_STRING(val1, $4));
2872 START(PLAC, $<ctxt>$)
2877 { end_element(ELT_SUB_LSS_SLGS_PLAC, PARENT, $<ctxt>5,
2882 /* MULTIMEDIA LINK */
2883 multim_link_sub : multim_obje_link_sect
2884 | multim_obje_emb_sect
2887 multim_obje_link_sect : OPEN DELIM TAG_OBJE DELIM POINTER
2888 { struct xref_value *xr = gedcom_parse_xref($5,
2891 if (xr == NULL) HANDLE_ERROR;
2893 = start_element(ELT_SUB_MULTIM_OBJE,
2895 GEDCOM_MAKE_XREF_PTR(val1, xr));
2896 START(OBJE, $<ctxt>$)
2901 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>6,
2906 multim_obje_emb_sect : OPEN DELIM TAG_OBJE
2907 { $<ctxt>$ = start_element(ELT_SUB_MULTIM_OBJE,
2908 PARENT, $1, $3, NULL,
2909 GEDCOM_MAKE_NULL(val1));
2910 START(OBJE, $<ctxt>$)
2912 multim_obje_emb_subs
2913 { CHECK2(FORM,FILE) }
2915 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>4,
2920 multim_obje_emb_subs : /* empty */
2921 | multim_obje_emb_subs multim_obje_emb_sub
2924 multim_obje_emb_sub : multim_obje_form_sect { OCCUR2(FORM, 1, 1) }
2925 | multim_obje_titl_sect { OCCUR2(TITL, 0, 1) }
2926 | multim_obje_file_sect { OCCUR2(FILE, 1, 1) }
2931 multim_obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
2933 = start_element(ELT_SUB_MULTIM_OBJE_FORM,
2935 GEDCOM_MAKE_STRING(val1, $4));
2936 START(FORM, $<ctxt>$)
2941 { end_element(ELT_SUB_MULTIM_OBJE_FORM,
2942 PARENT, $<ctxt>5, NULL);
2945 multim_obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
2947 = start_element(ELT_SUB_MULTIM_OBJE_TITL,
2949 GEDCOM_MAKE_STRING(val1, $4));
2950 START(TITL, $<ctxt>$)
2955 { end_element(ELT_SUB_MULTIM_OBJE_TITL,
2956 PARENT, $<ctxt>5, NULL);
2959 multim_obje_file_sect : OPEN DELIM TAG_FILE mand_line_item
2961 = start_element(ELT_SUB_MULTIM_OBJE_FILE,
2963 GEDCOM_MAKE_STRING(val1, $4));
2964 START(FILE, $<ctxt>$)
2969 { end_element(ELT_SUB_MULTIM_OBJE_FILE,
2970 PARENT, $<ctxt>5, NULL);
2974 /* NOTE STRUCTURE */
2975 note_struc_sub : note_struc_link_sect /* 0:M */
2976 | note_struc_emb_sect /* 0:M */
2979 note_struc_link_sect : OPEN DELIM TAG_NOTE DELIM POINTER
2980 { struct xref_value *xr = gedcom_parse_xref($5,
2983 if (xr == NULL) HANDLE_ERROR;
2985 = start_element(ELT_SUB_NOTE,
2987 GEDCOM_MAKE_XREF_PTR(val1, xr));
2988 START(NOTE, $<ctxt>$)
2990 note_struc_link_subs
2993 { end_element(ELT_SUB_NOTE, PARENT, $<ctxt>6, NULL);
2997 note_struc_link_subs : /* empty */
2998 | note_struc_link_subs note_struc_link_sub
3001 note_struc_link_sub : source_cit_sub
3005 note_struc_emb_sect : OPEN DELIM TAG_NOTE opt_line_item
3007 = start_element(ELT_SUB_NOTE,
3009 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
3010 START(NOTE, $<ctxt>$)
3015 { end_element(ELT_SUB_NOTE, PARENT, $<ctxt>5, NULL);
3019 note_struc_emb_subs : /* empty */
3020 | note_struc_emb_subs note_struc_emb_sub
3023 note_struc_emb_sub : continuation_sub
3028 /* PERSONAL NAME STRUCTURE */
3029 pers_name_struc_sub : pers_name_sect /* 0:M */
3032 pers_name_sect : OPEN DELIM TAG_NAME mand_line_item
3033 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME,
3035 GEDCOM_MAKE_STRING(val1, $4));
3036 START(NAME, $<ctxt>$)
3041 { end_element(ELT_SUB_PERS_NAME, PARENT, $<ctxt>5, NULL);
3045 pers_name_subs : /* empty */
3046 | pers_name_subs pers_name_sub
3049 pers_name_sub : pers_name_npfx_sect { OCCUR2(NPFX, 0, 1) }
3050 | pers_name_givn_sect { OCCUR2(GIVN, 0, 1) }
3051 | pers_name_nick_sect { OCCUR2(NICK, 0, 1) }
3052 | pers_name_spfx_sect { OCCUR2(SPFX, 0, 1) }
3053 | pers_name_surn_sect { OCCUR2(SURN, 0, 1) }
3054 | pers_name_nsfx_sect { OCCUR2(NSFX, 0, 1) }
3060 pers_name_npfx_sect : OPEN DELIM TAG_NPFX mand_line_item
3061 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NPFX,
3063 GEDCOM_MAKE_STRING(val1, $4));
3064 START(NPFX, $<ctxt>$)
3069 { end_element(ELT_SUB_PERS_NAME_NPFX, PARENT, $<ctxt>5,
3073 pers_name_givn_sect : OPEN DELIM TAG_GIVN mand_line_item
3074 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_GIVN,
3076 GEDCOM_MAKE_STRING(val1, $4));
3077 START(GIVN, $<ctxt>$)
3082 { end_element(ELT_SUB_PERS_NAME_GIVN, PARENT, $<ctxt>5,
3086 pers_name_nick_sect : OPEN DELIM TAG_NICK mand_line_item
3087 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NICK,
3089 GEDCOM_MAKE_STRING(val1, $4));
3090 START(NICK, $<ctxt>$)
3095 { end_element(ELT_SUB_PERS_NAME_NICK, PARENT, $<ctxt>5,
3099 pers_name_spfx_sect : OPEN DELIM TAG_SPFX mand_line_item
3100 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SPFX,
3102 GEDCOM_MAKE_STRING(val1, $4));
3103 START(SPFX, $<ctxt>$)
3108 { end_element(ELT_SUB_PERS_NAME_SPFX, PARENT, $<ctxt>5,
3112 pers_name_surn_sect : OPEN DELIM TAG_SURN mand_line_item
3113 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SURN,
3115 GEDCOM_MAKE_STRING(val1, $4));
3116 START(SURN, $<ctxt>$)
3121 { end_element(ELT_SUB_PERS_NAME_SURN, PARENT, $<ctxt>5,
3125 pers_name_nsfx_sect : OPEN DELIM TAG_NSFX mand_line_item
3126 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NSFX,
3128 GEDCOM_MAKE_STRING(val1, $4));
3129 START(NSFX, $<ctxt>$)
3134 { end_element(ELT_SUB_PERS_NAME_NSFX, PARENT, $<ctxt>5,
3139 /* PLACE STRUCTURE */
3140 place_struc_sub : place_struc_plac_sect /* 0:M */
3143 place_struc_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
3145 = start_element(ELT_SUB_PLAC,
3147 GEDCOM_MAKE_STRING(val1, $4));
3148 START(PLAC, $<ctxt>$)
3150 place_struc_plac_subs
3153 { end_element(ELT_SUB_PLAC, PARENT, $<ctxt>5, NULL);
3157 place_struc_plac_subs : /* empty */
3158 | place_struc_plac_subs place_struc_plac_sub
3161 place_struc_plac_sub : place_plac_form_sect { OCCUR2(FORM, 0, 1) }
3167 place_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
3169 = start_element(ELT_SUB_PLAC_FORM,
3171 GEDCOM_MAKE_STRING(val1, $4));
3172 START(FORM, $<ctxt>$)
3177 { end_element(ELT_SUB_PLAC_FORM, PARENT, $<ctxt>5,
3182 /* SOURCE_CITATION */
3183 source_cit_sub : source_cit_link_sect /* 0:M */
3184 | source_cit_emb_sect /* 0:M */
3187 source_cit_link_sect : OPEN DELIM TAG_SOUR DELIM POINTER
3188 { struct xref_value *xr = gedcom_parse_xref($5,
3191 if (xr == NULL) HANDLE_ERROR;
3193 = start_element(ELT_SUB_SOUR,
3195 GEDCOM_MAKE_XREF_PTR(val1, xr));
3196 START(SOUR, $<ctxt>$)
3198 source_cit_link_subs
3201 { end_element(ELT_SUB_SOUR, PARENT, $<ctxt>6, NULL);
3205 source_cit_link_subs : /* empty */
3206 | source_cit_link_subs source_cit_link_sub
3209 source_cit_link_sub : source_cit_page_sect { OCCUR2(PAGE, 0, 1) }
3210 | source_cit_even_sect { OCCUR2(EVEN, 0, 1) }
3211 | source_cit_data_sect { OCCUR2(DATA, 0, 1) }
3212 | source_cit_quay_sect { OCCUR2(QUAY, 0, 1) }
3218 source_cit_page_sect : OPEN DELIM TAG_PAGE mand_line_item
3220 = start_element(ELT_SUB_SOUR_PAGE,
3222 GEDCOM_MAKE_STRING(val1, $4));
3223 START(PAGE, $<ctxt>$)
3228 { end_element(ELT_SUB_SOUR_PAGE, PARENT, $<ctxt>5,
3233 source_cit_even_sect : OPEN DELIM TAG_EVEN mand_line_item
3235 = start_element(ELT_SUB_SOUR_EVEN,
3237 GEDCOM_MAKE_STRING(val1, $4));
3238 START(EVEN, $<ctxt>$)
3240 source_cit_even_subs
3243 { end_element(ELT_SUB_SOUR_EVEN, PARENT, $<ctxt>5,
3248 source_cit_even_subs : /* empty */
3249 | source_cit_even_subs source_cit_even_sub
3252 source_cit_even_sub : source_cit_even_role_sect { OCCUR2(ROLE, 0, 1) }
3256 source_cit_even_role_sect : OPEN DELIM TAG_ROLE mand_line_item
3258 = start_element(ELT_SUB_SOUR_EVEN_ROLE,
3260 GEDCOM_MAKE_STRING(val1, $4));
3261 START(ROLE, $<ctxt>$)
3266 { end_element(ELT_SUB_SOUR_EVEN_ROLE,
3267 PARENT, $<ctxt>5, NULL);
3271 source_cit_data_sect : OPEN DELIM TAG_DATA
3272 { $<ctxt>$ = start_element(ELT_SUB_SOUR_DATA,
3273 PARENT, $1, $3, NULL,
3274 GEDCOM_MAKE_NULL(val1));
3275 START(DATA, $<ctxt>$)
3277 source_cit_data_subs
3280 { end_element(ELT_SUB_SOUR_DATA, PARENT, $<ctxt>4,
3285 source_cit_data_subs : /* empty */
3286 | source_cit_data_subs source_cit_data_sub
3289 source_cit_data_sub : source_cit_data_date_sect { OCCUR2(DATE, 0, 1) }
3290 | source_cit_text_sect /* 0:M */
3294 source_cit_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
3295 { struct date_value dv = gedcom_parse_date($4);
3297 = start_element(ELT_SUB_SOUR_DATA_DATE,
3299 GEDCOM_MAKE_DATE(val1, dv));
3300 START(DATE, $<ctxt>$)
3305 { end_element(ELT_SUB_SOUR_DATA_DATE,
3306 PARENT, $<ctxt>5, NULL);
3310 source_cit_text_sect : OPEN DELIM TAG_TEXT mand_line_item
3312 = start_element(ELT_SUB_SOUR_TEXT,
3314 GEDCOM_MAKE_STRING(val1, $4));
3315 START(TEXT, $<ctxt>$)
3317 source_cit_text_subs
3320 { end_element(ELT_SUB_SOUR_TEXT, PARENT, $<ctxt>5,
3325 source_cit_text_subs : /* empty */
3326 | source_cit_text_subs source_cit_text_sub
3329 source_cit_text_sub : continuation_sub
3333 source_cit_quay_sect : OPEN DELIM TAG_QUAY mand_line_item
3335 = start_element(ELT_SUB_SOUR_QUAY,
3337 GEDCOM_MAKE_STRING(val1, $4));
3338 START(QUAY, $<ctxt>$)
3343 { end_element(ELT_SUB_SOUR_QUAY, PARENT, $<ctxt>5,
3348 source_cit_emb_sect : OPEN DELIM TAG_SOUR mand_line_item
3349 { $<ctxt>$ = start_element(ELT_SUB_SOUR,
3351 GEDCOM_MAKE_STRING(val1, $4));
3352 START(SOUR, $<ctxt>$)
3357 { end_element(ELT_SUB_SOUR, PARENT, $<ctxt>5, NULL);
3361 source_cit_emb_subs : /* empty */
3362 | source_cit_emb_subs source_cit_emb_sub
3365 source_cit_emb_sub : continuation_sub
3366 | source_cit_text_sect /* 0:M */
3371 /* SOURCE REPOSITORY CITATION */
3372 source_repos_cit_sub : source_repos_repo_sect { OCCUR2(REPO, 0, 1) }
3375 source_repos_repo_sect : OPEN DELIM TAG_REPO mand_pointer
3376 { struct xref_value *xr
3377 = gedcom_parse_xref($4, XREF_USED, XREF_REPO);
3378 if (xr == NULL) HANDLE_ERROR;
3380 = start_element(ELT_SUB_REPO,
3382 GEDCOM_MAKE_XREF_PTR(val1, xr));
3383 START(REPO, $<ctxt>$)
3385 source_repos_repo_subs
3388 { end_element(ELT_SUB_REPO, PARENT, $<ctxt>5, NULL);
3392 source_repos_repo_subs : /* empty */
3393 | source_repos_repo_subs source_repos_repo_sub
3396 source_repos_repo_sub : note_struc_sub
3397 | caln_sect /* 0:M */
3401 caln_sect : OPEN DELIM TAG_CALN mand_line_item
3402 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN,
3404 GEDCOM_MAKE_STRING(val1, $4));
3405 START(CALN, $<ctxt>$)
3410 { end_element(ELT_SUB_REPO_CALN, PARENT, $<ctxt>5, NULL);
3414 caln_subs : /* empty */
3415 | caln_subs caln_sub
3418 caln_sub : caln_medi_sect { OCCUR2(MEDI, 0, 1) }
3422 caln_medi_sect : OPEN DELIM TAG_MEDI mand_line_item
3423 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN_MEDI,
3425 GEDCOM_MAKE_STRING(val1, $4));
3426 START(MEDI, $<ctxt>$)
3431 { end_element(ELT_SUB_REPO_CALN_MEDI, PARENT, $<ctxt>5, NULL);
3435 /* SPOUSE TO FAMILY LINK */
3436 spou_fam_link_sub : spou_fam_fams_sect /* 0:M */
3439 spou_fam_fams_sect : OPEN DELIM TAG_FAMS mand_pointer
3440 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
3442 if (xr == NULL) HANDLE_ERROR;
3444 = start_element(ELT_SUB_FAMS,
3446 GEDCOM_MAKE_XREF_PTR(val1, xr));
3447 START(FAMS, $<ctxt>$)
3452 { end_element(ELT_SUB_FAMS, PARENT, $<ctxt>5, NULL);
3456 spou_fam_fams_subs : /* empty */
3457 | spou_fam_fams_subs spou_fam_fams_sub
3460 spou_fam_fams_sub : note_struc_sub
3464 /*********************************************************************/
3466 /*********************************************************************/
3468 no_std_subs : /* empty */
3469 | no_std_subs no_std_sub
3472 no_std_sub : user_sect /* 0:M */
3474 | error error_subs CLOSE { HANDLE_ERROR }
3477 no_std_rec : user_rec /* 0:M */
3479 | error error_subs CLOSE { HANDLE_ERROR }
3482 user_rec : OPEN DELIM opt_xref USERTAG
3483 { if ($4.string[0] != '_') {
3484 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3490 { struct xref_value *xr = NULL;
3492 xr = gedcom_parse_xref($3, XREF_DEFINED, XREF_USER);
3493 if (xr == NULL) HANDLE_ERROR;
3495 $<ctxt>$ = start_record(REC_USER,
3497 GEDCOM_MAKE_NULL_OR_XREF_PTR(val1, xr),
3504 { end_record(REC_USER, $<ctxt>7); }
3506 user_sect : OPEN DELIM opt_xref USERTAG
3507 { if ($4.string[0] != '_') {
3508 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3514 { $<ctxt>$ = start_element(ELT_USER, PARENT, $1, $4, $6, &val2);
3515 START($4, $<ctxt>$);
3520 { end_element(ELT_USER, PARENT, $<ctxt>7, NULL);
3524 user_sects : /* empty */ { }
3525 | user_sects user_sect { }
3528 opt_xref : /* empty */ { $$ = NULL; }
3529 | POINTER DELIM { $$ = $1; }
3532 opt_value : /* empty */ { GEDCOM_MAKE_NULL(val2);
3534 | DELIM POINTER { struct xref_value *xr
3535 = gedcom_parse_xref($2, XREF_USED,
3537 GEDCOM_MAKE_XREF_PTR(val2, xr);
3539 | DELIM line_item { GEDCOM_MAKE_STRING(val2, $2);
3543 mand_pointer : /* empty */ { gedcom_error(_("Missing pointer")); YYERROR; }
3544 | DELIM POINTER { gedcom_debug_print("==Ptr: %s==", $2);
3548 mand_line_item : /* empty */ { gedcom_error(_("Missing value")); YYERROR; }
3549 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3553 opt_line_item : /* empty */ { $$ = NULL; }
3554 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3558 line_item : anychar { size_t i;
3559 CLEAR_BUFFER(line_item_buf);
3560 line_item_buf_ptr = line_item_buf;
3561 /* The following also takes care of '@@' */
3562 if (!strncmp($1, "@@", 3))
3563 *line_item_buf_ptr++ = '@';
3565 for (i=0; i < strlen($1); i++)
3566 *line_item_buf_ptr++ = $1[i];
3569 | ESCAPE { size_t i;
3570 CLEAR_BUFFER(line_item_buf);
3571 line_item_buf_ptr = line_item_buf;
3572 for (i=0; i < strlen($1); i++)
3573 *line_item_buf_ptr++ = $1[i];
3578 /* The following also takes care of '@@' */
3579 if (!strncmp($2, "@@", 3))
3580 *line_item_buf_ptr++ = '@';
3582 for (i=0; i < strlen($2); i++)
3583 *line_item_buf_ptr++ = $2[i];
3588 for (i=0; i < strlen($2); i++)
3589 *line_item_buf_ptr++ = $2[i];
3594 anychar : ANYCHAR { }
3598 error_subs : /* empty */
3599 | error_subs error_sect
3602 error_sect : OPEN DELIM opt_xref anytag opt_value error_subs CLOSE { }
3604 gen_sect : OPEN DELIM opt_xref anystdtag
3605 { INVALID_TAG($4.string); }
3606 opt_value opt_sects CLOSE
3610 gen_rec : gen_rec_top
3614 gen_rec_norm : OPEN DELIM opt_xref anystdtag
3615 { INVALID_TOP_TAG($4.string) }
3616 opt_value opt_sects CLOSE
3620 gen_rec_top : OPEN DELIM anytoptag
3621 { gedcom_error(_("Missing cross-reference")); YYERROR; }
3622 opt_value opt_sects CLOSE
3626 opt_sects : /* empty */ { }
3627 | opt_sects gen_sect { }
3630 anytag : USERTAG { }
3644 anystdtag : TAG_ABBR
3774 /* Functions that handle the counting of subtags */
3776 int* count_arrays[MAXGEDCLEVEL+1];
3777 char tag_stack[MAXGEDCLEVEL+1][MAXSTDTAGLEN+1];
3778 Gedcom_ctxt ctxt_stack[MAXGEDCLEVEL+1];
3780 void push_countarray()
3783 if (count_level > MAXGEDCLEVEL) {
3784 gedcom_error(_("Internal error: count array overflow"));
3788 count = (int *)calloc(YYNTOKENS, sizeof(int));
3789 if (count == NULL) {
3790 gedcom_error(_("Internal error: count array calloc error"));
3794 count_arrays[count_level] = count;
3799 void set_parenttag(char* tag)
3801 strncpy(tag_stack[count_level+1], tag, MAXSTDTAGLEN+1);
3804 void set_parentctxt(Gedcom_ctxt ctxt)
3806 ctxt_stack[count_level+1] = ctxt;
3809 char* get_parenttag(int offset)
3811 return tag_stack[count_level - offset];
3814 Gedcom_ctxt get_parentctxt(int offset)
3816 return ctxt_stack[count_level - offset];
3819 int count_tag(int tag)
3821 int *count = count_arrays[count_level];
3822 return ++count[tag - GEDCOMTAGOFFSET];
3825 int check_occurrence(int tag)
3827 int *count = count_arrays[count_level];
3828 return (count[tag - GEDCOMTAGOFFSET] > 0);
3831 void pop_countarray()
3834 if (count_level < 0) {
3835 gedcom_error(_("Internal error: count array underflow"));
3839 count = count_arrays[count_level];
3841 count_arrays[count_level] = NULL;
3845 /* Enabling debug mode */
3846 /* level 0: no debugging */
3847 /* level 1: only internal */
3848 /* level 2: also bison */
3851 void gedcom_set_debug_level(int level, FILE* f)
3856 trace_output = stderr;
3858 gedcom_high_level_debug = 1;
3867 int gedcom_debug_print(char* s, ...)
3870 if (gedcom_high_level_debug) {
3873 res = vfprintf(trace_output, s, ap);
3875 fprintf(trace_output, "\n");
3880 /* Setting the error mechanism */
3881 void gedcom_set_error_handling(Gedcom_err_mech mechanism)
3883 error_mechanism = mechanism;
3886 /* Compatibility handling */
3888 void gedcom_set_compat_handling(int enable_compat)
3890 compat_enabled = enable_compat;
3893 void set_compatibility(char* program)
3895 if (compat_enabled) {
3896 if (! strncmp(program, "ftree", 6)) {
3897 gedcom_warning(_("Enabling compatibility with 'ftree'"));
3898 compatibility = C_FTREE;
3906 int compat_mode(int compat_flags)
3908 return (compat_flags & compatibility);