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"
156 int gedcom_high_level_debug = 0;
157 Gedcom_err_mech error_mechanism = IMMED_FAIL;
158 Gedcom_val_struct val1;
159 Gedcom_val_struct val2;
161 void cleanup_line_item_buffer();
162 struct safe_buffer line_item_buffer = { NULL, 0, NULL, 0,
163 cleanup_line_item_buffer };
165 void cleanup_concat_buffer();
166 struct safe_buffer concat_buffer = { NULL, 0, NULL, 0, cleanup_concat_buffer };
168 /* These are defined at the bottom of the file */
169 void push_countarray(int level);
170 void set_parenttag(const 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);
179 #define HANDLE_ERROR \
180 { if (error_mechanism == IMMED_FAIL) { \
181 clean_up(); YYABORT; \
183 else if (error_mechanism == DEFER_FAIL) { \
186 else if (error_mechanism == IGNORE_ERRORS) { \
190 #define START1(PARENTTAG) \
191 { set_parenttag(#PARENTTAG); \
193 #define START2(LEVEL,PARENTCTXT) \
194 { set_parentctxt(PARENTCTXT); \
196 push_countarray(LEVEL); \
198 #define START(PARENTTAG,LEVEL,PARENTCTXT) \
199 { START1(PARENTTAG); \
200 START2(LEVEL,PARENTCTXT); \
204 #define GRANDPARENT(OFF) \
207 { if (!check_occurrence(TAG_##TAG)) { \
208 char* parenttag = get_parenttag(0); \
209 gedcom_error(_("The tag '%s' is mandatory within '%s', but missing"),\
215 { pop_countarray(); \
219 #define CHECK1(TAG1) { CHK(TAG1); POP; }
220 #define CHECK2(TAG1,TAG2) \
221 { CHK(TAG1); CHK(TAG2); POP; }
222 #define CHECK3(TAG1,TAG2,TAG3) \
223 { CHK(TAG1); CHK(TAG2); CHK(TAG3); POP; }
224 #define CHECK4(TAG1,TAG2,TAG3,TAG4) \
225 { CHK(TAG1); CHK(TAG2); CHK(TAG3); CHK(TAG4); POP; }
226 #define OCCUR1(CHILDTAG, MIN) { count_tag(TAG_##CHILDTAG); }
227 #define OCCUR2(CHILDTAG, MIN, MAX) \
228 { int num = count_tag(TAG_##CHILDTAG); \
230 char* parenttag = get_parenttag(0); \
231 gedcom_error(_("The tag '%s' can maximally occur %d time(s) within '%s'"), \
232 #CHILDTAG, MAX, parenttag); \
236 #define INVALID_TAG(CHILDTAG) \
237 { char* parenttag = get_parenttag(0); \
238 gedcom_error(_("The tag '%s' is not a valid tag within '%s'"), \
239 CHILDTAG, parenttag); \
242 #define INVALID_TOP_TAG(CHILDTAG) \
243 { gedcom_error(_("The tag '%s' is not a valid top-level tag"), \
253 struct tag_struct tag;
260 %token <string> BADTOKEN
262 %token <string> CLOSE
263 %token <string> ESCAPE
264 %token <string> DELIM
265 %token <string> ANYCHAR
266 %token <string> POINTER
268 %token <tag> TAG_ABBR
269 %token <tag> TAG_ADDR
270 %token <tag> TAG_ADR1
271 %token <tag> TAG_ADR2
272 %token <tag> TAG_ADOP
275 %token <tag> TAG_AGNC
276 %token <tag> TAG_ALIA
277 %token <tag> TAG_ANCE
278 %token <tag> TAG_ANCI
279 %token <tag> TAG_ANUL
280 %token <tag> TAG_ASSO
281 %token <tag> TAG_AUTH
282 %token <tag> TAG_BAPL
283 %token <tag> TAG_BAPM
284 %token <tag> TAG_BARM
285 %token <tag> TAG_BASM
286 %token <tag> TAG_BIRT
287 %token <tag> TAG_BLES
288 %token <tag> TAG_BLOB
289 %token <tag> TAG_BURI
290 %token <tag> TAG_CALN
291 %token <tag> TAG_CAST
292 %token <tag> TAG_CAUS
293 %token <tag> TAG_CENS
294 %token <tag> TAG_CHAN
295 %token <tag> TAG_CHAR
296 %token <tag> TAG_CHIL
298 %token <tag> TAG_CHRA
299 %token <tag> TAG_CITY
300 %token <tag> TAG_CONC
301 %token <tag> TAG_CONF
302 %token <tag> TAG_CONL
303 %token <tag> TAG_CONT
304 %token <tag> TAG_COPR
305 %token <tag> TAG_CORP
306 %token <tag> TAG_CREM
307 %token <tag> TAG_CTRY
308 %token <tag> TAG_DATA
309 %token <tag> TAG_DATE
310 %token <tag> TAG_DEAT
311 %token <tag> TAG_DESC
312 %token <tag> TAG_DESI
313 %token <tag> TAG_DEST
315 %token <tag> TAG_DIVF
316 %token <tag> TAG_DSCR
317 %token <tag> TAG_EDUC
318 %token <tag> TAG_EMIG
319 %token <tag> TAG_ENDL
320 %token <tag> TAG_ENGA
321 %token <tag> TAG_EVEN
323 %token <tag> TAG_FAMC
324 %token <tag> TAG_FAMF
325 %token <tag> TAG_FAMS
326 %token <tag> TAG_FCOM
327 %token <tag> TAG_FILE
328 %token <tag> TAG_FORM
329 %token <tag> TAG_GEDC
330 %token <tag> TAG_GIVN
331 %token <tag> TAG_GRAD
332 %token <tag> TAG_HEAD
333 %token <tag> TAG_HUSB
334 %token <tag> TAG_IDNO
335 %token <tag> TAG_IMMI
336 %token <tag> TAG_INDI
337 %token <tag> TAG_LANG
338 %token <tag> TAG_LEGA
339 %token <tag> TAG_MARB
340 %token <tag> TAG_MARC
341 %token <tag> TAG_MARL
342 %token <tag> TAG_MARR
343 %token <tag> TAG_MARS
344 %token <tag> TAG_MEDI
345 %token <tag> TAG_NAME
346 %token <tag> TAG_NATI
347 %token <tag> TAG_NATU
348 %token <tag> TAG_NCHI
349 %token <tag> TAG_NICK
351 %token <tag> TAG_NOTE
352 %token <tag> TAG_NPFX
353 %token <tag> TAG_NSFX
354 %token <tag> TAG_OBJE
355 %token <tag> TAG_OCCU
356 %token <tag> TAG_ORDI
357 %token <tag> TAG_ORDN
358 %token <tag> TAG_PAGE
359 %token <tag> TAG_PEDI
360 %token <tag> TAG_PHON
361 %token <tag> TAG_PLAC
362 %token <tag> TAG_POST
363 %token <tag> TAG_PROB
364 %token <tag> TAG_PROP
365 %token <tag> TAG_PUBL
366 %token <tag> TAG_QUAY
367 %token <tag> TAG_REFN
368 %token <tag> TAG_RELA
369 %token <tag> TAG_RELI
370 %token <tag> TAG_REPO
371 %token <tag> TAG_RESI
372 %token <tag> TAG_RESN
373 %token <tag> TAG_RETI
376 %token <tag> TAG_ROLE
378 %token <tag> TAG_SLGC
379 %token <tag> TAG_SLGS
380 %token <tag> TAG_SOUR
381 %token <tag> TAG_SPFX
383 %token <tag> TAG_STAE
384 %token <tag> TAG_STAT
385 %token <tag> TAG_SUBM
386 %token <tag> TAG_SUBN
387 %token <tag> TAG_SURN
388 %token <tag> TAG_TEMP
389 %token <tag> TAG_TEXT
390 %token <tag> TAG_TIME
391 %token <tag> TAG_TITL
392 %token <tag> TAG_TRLR
393 %token <tag> TAG_TYPE
394 %token <tag> TAG_VERS
395 %token <tag> TAG_WIFE
396 %token <tag> TAG_WILL
398 %type <tag> anystdtag
399 %type <tag> anytoptag
400 %type <tag> fam_event_tag
401 %type <tag> indiv_attr_tag
402 %type <tag> indiv_birt_tag
403 %type <tag> indiv_gen_tag
404 %type <tag> lio_bapl_tag
405 %type <string> line_item
406 %type <string> mand_line_item
407 %type <string> mand_pointer
408 %type <string> note_line_item
409 %type <string> anychar
410 %type <string> opt_xref
411 %type <string> opt_value
412 %type <string> opt_line_item
413 %type <ctxt> head_sect
417 file : head_sect records trlr_sect
418 { if (fail == 1) YYABORT; }
423 records : /* empty */
438 /*********************************************************************/
440 /*********************************************************************/
441 head_sect : OPEN DELIM TAG_HEAD
442 { $<ctxt>$ = start_record(REC_HEAD, $1, GEDCOM_MAKE_NULL(val1),
444 NULL, GEDCOM_MAKE_NULL(val2));
445 START(HEAD, $1, $<ctxt>$) }
447 { if (compat_mode(C_NO_SUBMITTER))
448 compat_generate_submitter_link($<ctxt>4);
451 if (compat_mode(C_NO_GEDC))
452 compat_generate_gedcom($<ctxt>4);
455 if (compat_mode(C_NO_CHAR)) {
456 if (compat_generate_char($<ctxt>4)) HANDLE_ERROR;
463 { end_record(REC_HEAD, $<ctxt>4, GEDCOM_MAKE_NULL(val1));
464 if (compat_mode(C_NO_SUBMITTER))
465 compat_generate_submitter();
469 head_subs : /* empty */
473 head_sub : head_sour_sect { OCCUR2(SOUR, 1, 1) }
474 | head_dest_sect { OCCUR2(DEST, 0, 1) }
475 | head_date_sect { OCCUR2(DATE, 0, 1) }
476 | head_time_sect { if (!compat_mode(C_HEAD_TIME))
479 | head_subm_sect { OCCUR2(SUBM, 1, 1) }
480 | head_subn_sect { OCCUR2(SUBN, 0, 1) }
481 | head_file_sect { OCCUR2(FILE, 0, 1) }
482 | head_copr_sect { OCCUR2(COPR, 0, 1) }
483 | head_gedc_sect { OCCUR2(GEDC, 1, 1) }
484 | head_char_sect { OCCUR2(CHAR, 1, 1) }
485 | head_lang_sect { OCCUR2(LANG, 0, 1) }
486 | head_plac_sect { OCCUR2(PLAC, 0, 1) }
487 | head_note_sect { OCCUR2(NOTE, 0, 1) }
492 head_sour_sect : OPEN DELIM TAG_SOUR mand_line_item
493 { set_compatibility($4);
494 $<ctxt>$ = start_element(ELT_HEAD_SOUR, PARENT,
496 GEDCOM_MAKE_STRING(val1, $4));
497 START(SOUR, $1, $<ctxt>$)
502 { end_element(ELT_HEAD_SOUR, PARENT, $<ctxt>5,
503 GEDCOM_MAKE_NULL(val1)); }
506 head_sour_subs : /* empty */
507 | head_sour_subs head_sour_sub
510 head_sour_sub : head_sour_vers_sect { OCCUR2(VERS, 0, 1) }
511 | head_sour_name_sect { OCCUR2(NAME, 0, 1) }
512 | head_sour_corp_sect { OCCUR2(CORP, 0, 1) }
513 | head_sour_data_sect { OCCUR2(DATA, 0, 1) }
517 head_sour_vers_sect : OPEN DELIM TAG_VERS mand_line_item
518 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_VERS, PARENT,
520 GEDCOM_MAKE_STRING(val1, $4));
521 START(VERS, $1, $<ctxt>$)
526 { end_element(ELT_HEAD_SOUR_VERS,
527 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
530 head_sour_name_sect : OPEN DELIM TAG_NAME mand_line_item
531 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_NAME, PARENT,
533 GEDCOM_MAKE_STRING(val1, $4));
534 START(NAME, $1, $<ctxt>$)
539 { end_element(ELT_HEAD_SOUR_NAME,
540 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
543 head_sour_corp_sect : OPEN DELIM TAG_CORP mand_line_item
544 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_CORP, PARENT,
546 GEDCOM_MAKE_STRING(val1, $4));
547 START(CORP, $1, $<ctxt>$)
552 { end_element(ELT_HEAD_SOUR_CORP,
553 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
557 head_sour_corp_subs : /* empty */
558 | head_sour_corp_subs head_sour_corp_sub
561 head_sour_corp_sub : addr_struc_sub /* 0:1 */
565 head_sour_data_sect : OPEN DELIM TAG_DATA mand_line_item
566 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_DATA, PARENT,
568 GEDCOM_MAKE_STRING(val1, $4));
569 START(DATA, $1, $<ctxt>$)
574 { end_element(ELT_HEAD_SOUR_DATA,
575 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
579 head_sour_data_subs : /* empty */
580 | head_sour_data_subs head_sour_data_sub
583 head_sour_data_sub : head_sour_data_date_sect { OCCUR2(DATE, 0, 1) }
584 | head_sour_data_copr_sect { OCCUR2(COPR, 0, 1) }
588 head_sour_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
589 { struct date_value dv = gedcom_parse_date($4);
591 = start_element(ELT_HEAD_SOUR_DATA_DATE,
593 GEDCOM_MAKE_DATE(val1, dv));
594 START(DATE, $1, $<ctxt>$)
599 { end_element(ELT_HEAD_SOUR_DATA_DATE,
601 GEDCOM_MAKE_NULL(val1));
604 head_sour_data_copr_sect : OPEN DELIM TAG_COPR mand_line_item
606 = start_element(ELT_HEAD_SOUR_DATA_COPR,
608 GEDCOM_MAKE_STRING(val1, $4));
609 START(COPR, $1, $<ctxt>$)
614 { end_element(ELT_HEAD_SOUR_DATA_COPR,
616 GEDCOM_MAKE_NULL(val1));
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, $1, $<ctxt>$)
630 { end_element(ELT_HEAD_DEST,
631 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
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, $1, $<ctxt>$)
646 { end_element(ELT_HEAD_DATE,
647 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
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, $1, $<ctxt>$)
668 { end_element(ELT_HEAD_DATE_TIME,
669 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
673 /* HEAD.TIME (Only for 'Lifelines' compatibility) */
674 /* Just ignore the time... */
675 head_time_sect : OPEN DELIM TAG_TIME opt_line_item CLOSE
676 { gedcom_warning(_("Header change time lost in the compatibility"));
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, $1, $<ctxt>$)
693 { end_element(ELT_HEAD_SUBM,
694 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
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, $1, $<ctxt>$)
710 { end_element(ELT_HEAD_SUBN,
711 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
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, $1, $<ctxt>$)
724 { end_element(ELT_HEAD_FILE, PARENT, $<ctxt>5,
725 GEDCOM_MAKE_NULL(val1));
729 head_copr_sect : OPEN DELIM TAG_COPR mand_line_item
730 { $<ctxt>$ = start_element(ELT_HEAD_COPR,
732 GEDCOM_MAKE_STRING(val1, $4));
733 START(COPR, $1, $<ctxt>$)
738 { end_element(ELT_HEAD_COPR, PARENT, $<ctxt>5,
739 GEDCOM_MAKE_NULL(val1));
743 head_gedc_sect : OPEN DELIM TAG_GEDC
744 { $<ctxt>$ = start_element(ELT_HEAD_GEDC,
745 PARENT, $1, $3, NULL,
746 GEDCOM_MAKE_NULL(val1));
747 START(GEDC, $1, $<ctxt>$)
750 { CHECK2(VERS, FORM) }
752 { end_element(ELT_HEAD_GEDC, PARENT, $<ctxt>4,
753 GEDCOM_MAKE_NULL(val1));
757 head_gedc_subs : /* empty */
758 | head_gedc_subs head_gedc_sub
761 head_gedc_sub : head_gedc_vers_sect { OCCUR2(VERS, 1, 1) }
762 | head_gedc_form_sect { OCCUR2(FORM, 1, 1) }
765 head_gedc_vers_sect : OPEN DELIM TAG_VERS mand_line_item
766 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_VERS,
768 GEDCOM_MAKE_STRING(val1, $4));
769 START(VERS, $1, $<ctxt>$)
774 { end_element(ELT_HEAD_GEDC_VERS,
775 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
778 head_gedc_form_sect : OPEN DELIM TAG_FORM mand_line_item
779 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_FORM,
781 GEDCOM_MAKE_STRING(val1, $4));
782 START(FORM, $1, $<ctxt>$)
787 { end_element(ELT_HEAD_GEDC_FORM,
788 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
793 head_char_sect : OPEN DELIM TAG_CHAR mand_line_item
794 { /* Don't allow to continue if conversion context couldn't
796 if (open_conv_to_internal($4) == 0) HANDLE_ERROR;
797 $<ctxt>$ = start_element(ELT_HEAD_CHAR,
799 GEDCOM_MAKE_STRING(val1, $4));
800 START(CHAR, $1, $<ctxt>$)
805 { end_element(ELT_HEAD_CHAR, PARENT, $<ctxt>5,
806 GEDCOM_MAKE_NULL(val1));
810 head_char_subs : /* empty */
811 | head_char_subs head_char_sub
814 head_char_sub : head_char_vers_sect { OCCUR2(VERS, 0, 1) }
817 head_char_vers_sect : OPEN DELIM TAG_VERS mand_line_item
818 { $<ctxt>$ = start_element(ELT_HEAD_CHAR_VERS,
820 GEDCOM_MAKE_STRING(val1, $4));
821 START(VERS, $1, $<ctxt>$)
826 { end_element(ELT_HEAD_CHAR_VERS,
827 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
832 head_lang_sect : OPEN DELIM TAG_LANG mand_line_item
833 { $<ctxt>$ = start_element(ELT_HEAD_LANG,
835 GEDCOM_MAKE_STRING(val1, $4));
836 START(LANG, $1, $<ctxt>$)
841 { end_element(ELT_HEAD_LANG, PARENT, $<ctxt>5,
842 GEDCOM_MAKE_NULL(val1));
846 head_plac_sect : OPEN DELIM TAG_PLAC
847 { $<ctxt>$ = start_element(ELT_HEAD_PLAC,
848 PARENT, $1, $3, NULL,
849 GEDCOM_MAKE_NULL(val1));
850 START(PLAC, $1, $<ctxt>$)
855 { end_element(ELT_HEAD_PLAC, PARENT, $<ctxt>4,
856 GEDCOM_MAKE_NULL(val1));
860 head_plac_subs : /* empty */
861 | head_plac_subs head_plac_sub
864 head_plac_sub : head_plac_form_sect { OCCUR2(FORM, 1, 1) }
867 head_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
868 { $<ctxt>$ = start_element(ELT_HEAD_PLAC_FORM,
870 GEDCOM_MAKE_STRING(val1, $4));
871 START(FORM, $1, $<ctxt>$)
876 { end_element(ELT_HEAD_PLAC_FORM,
877 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
882 head_note_sect : OPEN DELIM TAG_NOTE mand_line_item
883 { $<ctxt>$ = start_element(ELT_HEAD_NOTE,
885 GEDCOM_MAKE_STRING(val1, $4));
886 reset_buffer(&concat_buffer);
887 safe_buf_append(&concat_buffer, $4);
888 START(NOTE, $1, $<ctxt>$)
893 { char* complete = get_buf_string(&concat_buffer);
894 end_element(ELT_HEAD_NOTE, PARENT, $<ctxt>5,
895 GEDCOM_MAKE_STRING(val1, complete));
899 head_note_subs : /* empty */
900 | head_note_subs head_note_sub
903 head_note_sub : continuation_sub /* 0:M */
907 /*********************************************************************/
909 /*********************************************************************/
910 /* Don't need callbacks here, there is no information... */
911 trlr_sect : OPEN DELIM TAG_TRLR CLOSE { }
914 /*********************************************************************/
915 /**** Family record ****/
916 /*********************************************************************/
917 fam_rec : OPEN DELIM POINTER DELIM TAG_FAM
918 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
920 if (xr == NULL) HANDLE_ERROR;
921 $<ctxt>$ = start_record(REC_FAM,
922 $1, GEDCOM_MAKE_XREF_PTR(val1, xr),
924 NULL, GEDCOM_MAKE_NULL(val2));
925 START(FAM, $1, $<ctxt>$) }
929 { end_record(REC_FAM, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
932 fam_subs : /* empty */
936 fam_sub : fam_event_struc_sub /* 0:M */
937 | fam_husb_sect { OCCUR2(HUSB, 0, 1) }
938 | fam_wife_sect { OCCUR2(WIFE, 0, 1) }
939 | fam_chil_sect /* 0:M */
940 | fam_nchi_sect { OCCUR2(NCHI, 0, 1) }
941 | fam_subm_sect /* 0:M */
942 | lds_spouse_seal_sub /* 0:M */
943 | source_cit_sub /* 0:M */
944 | multim_link_sub /* 0:M */
945 | note_struc_sub /* 0:M */
946 | ident_struc_sub /* 0:1 */
947 | change_date_sub /* 0:1 */
952 fam_husb_sect : OPEN DELIM TAG_HUSB mand_pointer
953 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
955 if (xr == NULL) HANDLE_ERROR;
956 $<ctxt>$ = start_element(ELT_FAM_HUSB,
958 GEDCOM_MAKE_XREF_PTR(val1, xr));
959 START(HUSB, $1, $<ctxt>$)
964 { end_element(ELT_FAM_HUSB, PARENT, $<ctxt>5,
965 GEDCOM_MAKE_NULL(val1));
970 fam_wife_sect : OPEN DELIM TAG_WIFE mand_pointer
971 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
973 if (xr == NULL) HANDLE_ERROR;
974 $<ctxt>$ = start_element(ELT_FAM_WIFE,
976 GEDCOM_MAKE_XREF_PTR(val1, xr));
977 START(WIFE, $1, $<ctxt>$)
982 { end_element(ELT_FAM_WIFE, PARENT, $<ctxt>5,
983 GEDCOM_MAKE_NULL(val1));
988 fam_chil_sect : OPEN DELIM TAG_CHIL mand_pointer
989 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
991 if (xr == NULL) HANDLE_ERROR;
992 $<ctxt>$ = start_element(ELT_FAM_CHIL,
994 GEDCOM_MAKE_XREF_PTR(val1, xr));
995 START(CHIL, $1, $<ctxt>$)
1000 { end_element(ELT_FAM_CHIL, PARENT, $<ctxt>5,
1001 GEDCOM_MAKE_NULL(val1));
1006 fam_nchi_sect : OPEN DELIM TAG_NCHI mand_line_item
1007 { $<ctxt>$ = start_element(ELT_FAM_NCHI,
1009 GEDCOM_MAKE_STRING(val1, $4));
1010 START(NCHI, $1, $<ctxt>$)
1015 { end_element(ELT_FAM_NCHI, PARENT, $<ctxt>5,
1016 GEDCOM_MAKE_NULL(val1));
1021 fam_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1022 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1024 if (xr == NULL) HANDLE_ERROR;
1025 $<ctxt>$ = start_element(ELT_FAM_SUBM,
1027 GEDCOM_MAKE_XREF_PTR(val1, xr));
1028 START(SUBM, $1, $<ctxt>$)
1033 { end_element(ELT_FAM_SUBM, PARENT, $<ctxt>5,
1034 GEDCOM_MAKE_NULL(val1));
1038 /*********************************************************************/
1039 /**** Individual record ****/
1040 /*********************************************************************/
1041 indiv_rec : OPEN DELIM POINTER DELIM TAG_INDI
1042 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1044 if (xr == NULL) HANDLE_ERROR;
1045 $<ctxt>$ = start_record(REC_INDI,
1046 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1047 NULL, GEDCOM_MAKE_NULL(val2));
1048 START(INDI, $1, $<ctxt>$) }
1052 { end_record(REC_INDI, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1055 indi_subs : /* empty */
1056 | indi_subs indi_sub
1059 indi_sub : indi_resn_sect { OCCUR2(RESN, 0, 1) }
1060 | pers_name_struc_sub /* 0:M */
1061 | indi_sex_sect { OCCUR2(SEX, 0, 1) }
1062 | indiv_even_struc_sub /* 0:M */
1063 | indiv_attr_struc_sub /* 0:M */
1064 | lds_indiv_ord_sub /* 0:M */
1065 | chi_fam_link_sub /* 0:M */
1066 | spou_fam_link_sub /* 0:M */
1067 | indi_subm_sect /* 0:M */
1068 | assoc_struc_sub /* 0:M */
1069 | indi_alia_sect /* 0:M */
1070 | indi_anci_sect /* 0:M */
1071 | indi_desi_sect /* 0:M */
1072 | source_cit_sub /* 0:M */
1073 | multim_link_sub /* 0:M */
1074 | note_struc_sub /* 0:M */
1075 | indi_rfn_sect { OCCUR2(RFN, 0, 1) }
1076 | indi_afn_sect /* 0:M */
1077 | ident_struc_sub /* 0:1 */
1078 | change_date_sub /* 0:1 */
1079 | indi_addr_sect { if (!compat_mode(C_INDI_ADDR))
1080 INVALID_TAG("ADDR");
1086 indi_resn_sect : OPEN DELIM TAG_RESN mand_line_item
1087 { $<ctxt>$ = start_element(ELT_INDI_RESN,
1089 GEDCOM_MAKE_STRING(val1, $4));
1090 START(RESN, $1, $<ctxt>$)
1095 { end_element(ELT_INDI_RESN, PARENT, $<ctxt>5,
1096 GEDCOM_MAKE_NULL(val1));
1101 indi_sex_sect : OPEN DELIM TAG_SEX mand_line_item
1102 { $<ctxt>$ = start_element(ELT_INDI_SEX,
1104 GEDCOM_MAKE_STRING(val1, $4));
1105 START(SEX, $1, $<ctxt>$)
1110 { end_element(ELT_INDI_SEX, PARENT, $<ctxt>5,
1111 GEDCOM_MAKE_NULL(val1));
1116 indi_subm_sect : OPEN DELIM TAG_SUBM 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_SUBM,
1122 GEDCOM_MAKE_XREF_PTR(val1, xr));
1123 START(SUBM, $1, $<ctxt>$)
1128 { end_element(ELT_INDI_SUBM, PARENT, $<ctxt>5,
1129 GEDCOM_MAKE_NULL(val1));
1134 indi_alia_sect : OPEN DELIM TAG_ALIA mand_pointer
1135 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1137 if (xr == NULL) HANDLE_ERROR;
1138 $<ctxt>$ = start_element(ELT_INDI_ALIA,
1140 GEDCOM_MAKE_XREF_PTR(val1, xr));
1141 START(ALIA, $1, $<ctxt>$)
1146 { end_element(ELT_INDI_ALIA, PARENT, $<ctxt>5,
1147 GEDCOM_MAKE_NULL(val1));
1152 indi_anci_sect : OPEN DELIM TAG_ANCI mand_pointer
1153 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1155 if (xr == NULL) HANDLE_ERROR;
1156 $<ctxt>$ = start_element(ELT_INDI_ANCI,
1158 GEDCOM_MAKE_XREF_PTR(val1, xr));
1159 START(ANCI, $1, $<ctxt>$)
1164 { end_element(ELT_INDI_ANCI, PARENT, $<ctxt>5,
1165 GEDCOM_MAKE_NULL(val1));
1170 indi_desi_sect : OPEN DELIM TAG_DESI mand_pointer
1171 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1173 if (xr == NULL) HANDLE_ERROR;
1174 $<ctxt>$ = start_element(ELT_INDI_DESI,
1176 GEDCOM_MAKE_XREF_PTR(val1, xr));
1177 START(DESI, $1, $<ctxt>$)
1182 { end_element(ELT_INDI_DESI, PARENT, $<ctxt>5,
1183 GEDCOM_MAKE_NULL(val1));
1188 indi_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1189 { $<ctxt>$ = start_element(ELT_INDI_RFN,
1191 GEDCOM_MAKE_STRING(val1, $4));
1192 START(RFN, $1, $<ctxt>$)
1197 { end_element(ELT_INDI_RFN, PARENT, $<ctxt>5,
1198 GEDCOM_MAKE_NULL(val1));
1203 indi_afn_sect : OPEN DELIM TAG_AFN mand_line_item
1204 { $<ctxt>$ = start_element(ELT_INDI_AFN,
1206 GEDCOM_MAKE_STRING(val1, $4));
1207 START(AFN, $1, $<ctxt>$)
1212 { end_element(ELT_INDI_AFN, PARENT, $<ctxt>5,
1213 GEDCOM_MAKE_NULL(val1));
1217 /* INDI.ADDR (Only for compatibility) */
1218 indi_addr_sect : OPEN DELIM TAG_ADDR opt_line_item
1219 { if (compat_mode(C_INDI_ADDR)) {
1220 Gedcom_ctxt par = compat_generate_resi_start(PARENT);
1221 START(RESI, $1, par);
1223 = start_element(ELT_SUB_ADDR,
1224 par, $1 + 1, $3, $4,
1225 GEDCOM_MAKE_NULL_OR_STRING(val2, $4));
1226 START(ADDR, $1 + 1, $<ctxt>$);
1228 else { START(ADDR, $1, NULL) }
1233 { if (compat_mode(C_INDI_ADDR)) {
1234 Gedcom_ctxt par = PARENT;
1235 end_element(ELT_SUB_ADDR, par, $<ctxt>5,
1236 GEDCOM_MAKE_NULL(val1));
1238 compat_generate_resi_end(PARENT, par);
1243 ftree_addr_subs : /* empty */
1244 | ftree_addr_subs ftree_addr_sub
1247 ftree_addr_sub : continuation_sub
1248 | ftree_addr_phon_sect
1252 ftree_addr_phon_sect : OPEN DELIM TAG_PHON mand_line_item
1254 = start_element(ELT_SUB_PHON,
1255 GRANDPARENT(1), $1, $3, $4,
1256 GEDCOM_MAKE_STRING(val1, $4));
1257 START(PHON, $1, $<ctxt>$)
1262 { end_element(ELT_SUB_PHON, GRANDPARENT(1),
1263 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1267 /*********************************************************************/
1268 /**** Multimedia record ****/
1269 /*********************************************************************/
1270 multim_rec : OPEN DELIM POINTER DELIM TAG_OBJE
1271 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1273 if (xr == NULL) HANDLE_ERROR;
1274 $<ctxt>$ = start_record(REC_OBJE,
1275 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1276 NULL, GEDCOM_MAKE_NULL(val2));
1277 START(OBJE, $1, $<ctxt>$) }
1279 { CHECK2(FORM, BLOB) }
1281 { end_record(REC_OBJE, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1284 obje_subs : /* empty */
1285 | obje_subs obje_sub
1288 obje_sub : obje_form_sect { OCCUR2(FORM, 1, 1) }
1289 | obje_titl_sect { OCCUR2(TITL, 0, 1) }
1290 | note_struc_sub /* 0:M */
1291 | obje_blob_sect { OCCUR2(BLOB, 1, 1) }
1292 | obje_obje_sect { OCCUR2(OBJE, 0, 1) }
1293 | ident_struc_sub /* 0:1 */
1294 | change_date_sub /* 0:1 */
1299 obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
1300 { $<ctxt>$ = start_element(ELT_OBJE_FORM,
1302 GEDCOM_MAKE_STRING(val1, $4));
1303 START(FORM, $1, $<ctxt>$)
1308 { end_element(ELT_OBJE_FORM, PARENT, $<ctxt>5,
1309 GEDCOM_MAKE_NULL(val1));
1314 obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1315 { $<ctxt>$ = start_element(ELT_OBJE_TITL,
1317 GEDCOM_MAKE_STRING(val1, $4));
1318 START(TITL, $1, $<ctxt>$)
1323 { end_element(ELT_OBJE_TITL, PARENT, $<ctxt>5,
1324 GEDCOM_MAKE_NULL(val1));
1329 obje_blob_sect : OPEN DELIM TAG_BLOB
1330 { $<ctxt>$ = start_element(ELT_OBJE_BLOB,
1331 PARENT, $1, $3, NULL,
1332 GEDCOM_MAKE_NULL(val1));
1333 reset_buffer(&concat_buffer);
1334 START(BLOB, $1, $<ctxt>$)
1339 { char* complete = get_buf_string(&concat_buffer);
1340 end_element(ELT_OBJE_BLOB, PARENT, $<ctxt>4,
1341 GEDCOM_MAKE_STRING(val1, complete));
1345 obje_blob_subs : /* empty */
1346 | obje_blob_subs obje_blob_sub
1349 obje_blob_sub : obje_blob_cont_sect { OCCUR1(CONT, 1) }
1353 obje_blob_cont_sect : OPEN DELIM TAG_CONT mand_line_item
1354 { $<ctxt>$ = start_element(ELT_OBJE_BLOB_CONT,
1356 GEDCOM_MAKE_STRING(val1, $4));
1357 safe_buf_append(&concat_buffer, $4);
1358 START(CONT, $1, $<ctxt>$)
1363 { end_element(ELT_OBJE_BLOB_CONT, PARENT,
1364 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1369 obje_obje_sect : OPEN DELIM TAG_OBJE mand_pointer
1370 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1372 if (xr == NULL) HANDLE_ERROR;
1373 $<ctxt>$ = start_element(ELT_OBJE_OBJE,
1375 GEDCOM_MAKE_XREF_PTR(val1, xr));
1376 START(OBJE, $1, $<ctxt>$)
1381 { end_element(ELT_OBJE_OBJE, PARENT, $<ctxt>5,
1382 GEDCOM_MAKE_NULL(val1));
1386 /*********************************************************************/
1387 /**** Note record ****/
1388 /*********************************************************************/
1389 note_rec : OPEN DELIM POINTER DELIM TAG_NOTE note_line_item
1390 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1392 if (xr == NULL) HANDLE_ERROR;
1393 $<ctxt>$ = start_record(REC_NOTE,
1394 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1395 $6, GEDCOM_MAKE_STRING(val2, $6));
1396 reset_buffer(&concat_buffer);
1397 safe_buf_append(&concat_buffer, $6);
1398 START(NOTE, $1, $<ctxt>$) }
1402 { char* complete = get_buf_string(&concat_buffer);
1403 end_record(REC_NOTE, $<ctxt>7,
1404 GEDCOM_MAKE_STRING(val1, complete)); }
1407 note_line_item : /* empty */
1408 { if (!compat_mode(C_NOTE_NO_VALUE)) {
1409 gedcom_error(_("Missing value")); YYERROR;
1416 { gedcom_debug_print("==Val: %s==", $2);
1420 note_subs : /* empty */
1421 | note_subs note_sub
1424 note_sub : continuation_sub /* 0:M */
1425 | source_cit_sub /* 0:M */
1426 | ident_struc_sub /* 0:1 */
1427 | change_date_sub /* 0:1 */
1431 /*********************************************************************/
1432 /**** Repository record ****/
1433 /*********************************************************************/
1434 repos_rec : OPEN DELIM POINTER DELIM TAG_REPO
1435 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1437 if (xr == NULL) HANDLE_ERROR;
1438 $<ctxt>$ = start_record(REC_REPO,
1439 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1440 NULL, GEDCOM_MAKE_NULL(val2));
1441 START(REPO, $1, $<ctxt>$) }
1445 { end_record(REC_REPO, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1448 repo_subs : /* empty */
1449 | repo_subs repo_sub
1452 repo_sub : repo_name_sect { OCCUR2(NAME, 0, 1) }
1453 | addr_struc_sub /* 0:1 */
1454 | note_struc_sub /* 0:M */
1455 | ident_struc_sub /* 0:1 */
1456 | change_date_sub /* 0:1 */
1461 repo_name_sect : OPEN DELIM TAG_NAME mand_line_item
1462 { $<ctxt>$ = start_element(ELT_REPO_NAME,
1464 GEDCOM_MAKE_STRING(val1, $4));
1465 START(NAME, $1, $<ctxt>$)
1470 { end_element(ELT_REPO_NAME, PARENT, $<ctxt>5,
1471 GEDCOM_MAKE_NULL(val1));
1475 /*********************************************************************/
1476 /**** Source record ****/
1477 /*********************************************************************/
1478 source_rec : OPEN DELIM POINTER DELIM TAG_SOUR
1479 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1481 if (xr == NULL) HANDLE_ERROR;
1482 $<ctxt>$ = start_record(REC_SOUR,
1483 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1484 NULL, GEDCOM_MAKE_NULL(val2));
1485 START(SOUR, $1, $<ctxt>$) }
1489 { end_record(REC_SOUR, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1492 sour_subs : /* empty */
1493 | sour_subs sour_sub
1496 sour_sub : sour_data_sect { OCCUR2(DATA, 0, 1) }
1497 | sour_auth_sect { OCCUR2(AUTH, 0, 1) }
1498 | sour_titl_sect { OCCUR2(TITL, 0, 1) }
1499 | sour_abbr_sect { OCCUR2(ABBR, 0, 1) }
1500 | sour_publ_sect { OCCUR2(PUBL, 0, 1) }
1501 | sour_text_sect { OCCUR2(TEXT, 0, 1) }
1502 | source_repos_cit_sub /* 0:1 */
1503 | multim_link_sub /* 0:M */
1504 | note_struc_sub /* 0:M */
1505 | ident_struc_sub /* 0:1 */
1506 | change_date_sub /* 0:1 */
1511 sour_data_sect : OPEN DELIM TAG_DATA
1512 { $<ctxt>$ = start_element(ELT_SOUR_DATA,
1513 PARENT, $1, $3, NULL,
1514 GEDCOM_MAKE_NULL(val1));
1515 START(DATA, $1, $<ctxt>$)
1520 { end_element(ELT_SOUR_DATA, PARENT, $<ctxt>4,
1521 GEDCOM_MAKE_NULL(val1));
1525 sour_data_subs : /* empty */
1526 | sour_data_subs sour_data_sub
1529 sour_data_sub : sour_data_even_sect /* 0:M */
1530 | sour_data_agnc_sect { OCCUR2(AGNC, 0, 1) }
1531 | note_struc_sub /* 0:M */
1535 sour_data_even_sect : OPEN DELIM TAG_EVEN mand_line_item
1536 { $<ctxt>$ = start_element(ELT_SOUR_DATA_EVEN,
1538 GEDCOM_MAKE_STRING(val1, $4));
1539 START(EVEN, $1, $<ctxt>$)
1544 { end_element(ELT_SOUR_DATA_EVEN, PARENT,
1545 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1549 sour_data_even_subs : /* empty */
1550 | sour_data_even_subs sour_data_even_sub
1553 sour_data_even_sub : sour_data_even_date_sect { OCCUR2(DATE, 0, 1) }
1554 | sour_data_even_plac_sect { OCCUR2(PLAC, 0, 1) }
1558 sour_data_even_date_sect : OPEN DELIM TAG_DATE mand_line_item
1559 { struct date_value dv = gedcom_parse_date($4);
1561 = start_element(ELT_SOUR_DATA_EVEN_DATE,
1563 GEDCOM_MAKE_DATE(val1, dv));
1564 START(DATE, $1, $<ctxt>$)
1569 { end_element(ELT_SOUR_DATA_EVEN_DATE, PARENT,
1570 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1574 sour_data_even_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
1576 = start_element(ELT_SOUR_DATA_EVEN_PLAC,
1578 GEDCOM_MAKE_STRING(val1, $4));
1579 START(PLAC, $1, $<ctxt>$)
1584 { end_element(ELT_SOUR_DATA_EVEN_PLAC, PARENT,
1585 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1589 sour_data_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
1590 { $<ctxt>$ = start_element(ELT_SOUR_DATA_AGNC,
1592 GEDCOM_MAKE_STRING(val1, $4));
1593 START(AGNC, $1, $<ctxt>$)
1598 { end_element(ELT_SOUR_DATA_AGNC, PARENT,
1599 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1604 sour_auth_sect : OPEN DELIM TAG_AUTH mand_line_item
1605 { $<ctxt>$ = start_element(ELT_SOUR_AUTH,
1607 GEDCOM_MAKE_STRING(val1, $4));
1608 reset_buffer(&concat_buffer);
1609 safe_buf_append(&concat_buffer, $4);
1610 START(AUTH, $1, $<ctxt>$)
1615 { char* complete = get_buf_string(&concat_buffer);
1616 end_element(ELT_SOUR_AUTH, PARENT, $<ctxt>5,
1617 GEDCOM_MAKE_STRING(val1, complete));
1621 sour_auth_subs : /* empty */
1622 | sour_auth_subs sour_auth_sub
1625 sour_auth_sub : continuation_sub /* 0:M */
1630 sour_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1631 { $<ctxt>$ = start_element(ELT_SOUR_TITL,
1633 GEDCOM_MAKE_STRING(val1, $4));
1634 reset_buffer(&concat_buffer);
1635 safe_buf_append(&concat_buffer, $4);
1636 START(TITL, $1, $<ctxt>$)
1641 { char* complete = get_buf_string(&concat_buffer);
1642 end_element(ELT_SOUR_TITL, PARENT, $<ctxt>5,
1643 GEDCOM_MAKE_STRING(val1, complete));
1647 sour_titl_subs : /* empty */
1648 | sour_titl_subs sour_titl_sub
1651 sour_titl_sub : continuation_sub /* 0:M */
1656 sour_abbr_sect : OPEN DELIM TAG_ABBR mand_line_item
1657 { $<ctxt>$ = start_element(ELT_SOUR_ABBR,
1659 GEDCOM_MAKE_STRING(val1, $4));
1660 START(ABBR, $1, $<ctxt>$)
1665 { end_element(ELT_SOUR_ABBR, PARENT, $<ctxt>5,
1666 GEDCOM_MAKE_NULL(val1));
1671 sour_publ_sect : OPEN DELIM TAG_PUBL mand_line_item
1672 { $<ctxt>$ = start_element(ELT_SOUR_PUBL,
1674 GEDCOM_MAKE_STRING(val1, $4));
1675 reset_buffer(&concat_buffer);
1676 safe_buf_append(&concat_buffer, $4);
1677 START(PUBL, $1, $<ctxt>$)
1682 { char* complete = get_buf_string(&concat_buffer);
1683 end_element(ELT_SOUR_PUBL, PARENT, $<ctxt>5,
1684 GEDCOM_MAKE_STRING(val1, complete));
1688 sour_publ_subs : /* empty */
1689 | sour_publ_subs sour_publ_sub
1692 sour_publ_sub : continuation_sub /* 0:M */
1697 sour_text_sect : OPEN DELIM TAG_TEXT mand_line_item
1698 { $<ctxt>$ = start_element(ELT_SOUR_TEXT,
1700 GEDCOM_MAKE_STRING(val1, $4));
1701 reset_buffer(&concat_buffer);
1702 safe_buf_append(&concat_buffer, $4);
1703 START(TEXT, $1, $<ctxt>$)
1708 { char* complete = get_buf_string(&concat_buffer);
1709 end_element(ELT_SOUR_TEXT, PARENT, $<ctxt>5,
1710 GEDCOM_MAKE_STRING(val1, complete));
1714 sour_text_subs : /* empty */
1715 | sour_text_subs sour_text_sub
1718 sour_text_sub : continuation_sub /* 0:M */
1722 /*********************************************************************/
1723 /**** Submission record ****/
1724 /*********************************************************************/
1725 submis_rec : OPEN DELIM POINTER DELIM TAG_SUBN
1726 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1728 if (xr == NULL) HANDLE_ERROR;
1729 $<ctxt>$ = start_record(REC_SUBN,
1730 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1731 NULL, GEDCOM_MAKE_NULL(val2));
1732 START(SUBN, $1, $<ctxt>$) }
1736 { end_record(REC_SUBN, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1739 subn_subs : /* empty */
1740 | subn_subs subn_sub
1743 subn_sub : subn_subm_sect { OCCUR2(SUBM, 0, 1) }
1744 | subn_famf_sect { OCCUR2(FAMF, 0, 1) }
1745 | subn_temp_sect { OCCUR2(TEMP, 0, 1) }
1746 | subn_ance_sect { OCCUR2(ANCE, 0, 1) }
1747 | subn_desc_sect { OCCUR2(DESC, 0, 1) }
1748 | subn_ordi_sect { OCCUR2(ORDI, 0, 1) }
1749 | subn_rin_sect { OCCUR2(RIN, 0, 1) }
1754 subn_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1755 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1757 if (xr == NULL) HANDLE_ERROR;
1758 $<ctxt>$ = start_element(ELT_SUBN_SUBM,
1760 GEDCOM_MAKE_XREF_PTR(val1, xr));
1761 START(SUBM, $1, $<ctxt>$)
1766 { end_element(ELT_SUBN_SUBM, PARENT, $<ctxt>5,
1767 GEDCOM_MAKE_NULL(val1));
1772 subn_famf_sect : OPEN DELIM TAG_FAMF mand_line_item
1773 { $<ctxt>$ = start_element(ELT_SUBN_FAMF,
1775 GEDCOM_MAKE_STRING(val1, $4));
1776 START(FAMF, $1, $<ctxt>$)
1781 { end_element(ELT_SUBN_FAMF, PARENT, $<ctxt>5,
1782 GEDCOM_MAKE_NULL(val1));
1787 subn_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
1788 { $<ctxt>$ = start_element(ELT_SUBN_TEMP,
1790 GEDCOM_MAKE_STRING(val1, $4));
1791 START(TEMP, $1, $<ctxt>$)
1796 { end_element(ELT_SUBN_TEMP, PARENT, $<ctxt>5,
1797 GEDCOM_MAKE_NULL(val1));
1802 subn_ance_sect : OPEN DELIM TAG_ANCE mand_line_item
1803 { $<ctxt>$ = start_element(ELT_SUBN_ANCE,
1805 GEDCOM_MAKE_STRING(val1, $4));
1806 START(ANCE, $1, $<ctxt>$)
1811 { end_element(ELT_SUBN_ANCE, PARENT, $<ctxt>5,
1812 GEDCOM_MAKE_NULL(val1));
1817 subn_desc_sect : OPEN DELIM TAG_DESC mand_line_item
1818 { $<ctxt>$ = start_element(ELT_SUBN_DESC,
1820 GEDCOM_MAKE_STRING(val1, $4));
1821 START(DESC, $1, $<ctxt>$)
1826 { end_element(ELT_SUBN_DESC, PARENT, $<ctxt>5,
1827 GEDCOM_MAKE_NULL(val1));
1832 subn_ordi_sect : OPEN DELIM TAG_ORDI mand_line_item
1833 { $<ctxt>$ = start_element(ELT_SUBN_ORDI,
1835 GEDCOM_MAKE_STRING(val1, $4));
1836 START(ORDI, $1, $<ctxt>$)
1841 { end_element(ELT_SUBN_ORDI, PARENT, $<ctxt>5,
1842 GEDCOM_MAKE_NULL(val1));
1847 subn_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1848 { $<ctxt>$ = start_element(ELT_SUBN_RIN,
1850 GEDCOM_MAKE_STRING(val1, $4));
1851 START(RIN, $1, $<ctxt>$)
1856 { end_element(ELT_SUBN_RIN, PARENT, $<ctxt>5,
1857 GEDCOM_MAKE_NULL(val1));
1861 /*********************************************************************/
1862 /**** Submitter record ****/
1863 /*********************************************************************/
1864 submit_rec : OPEN DELIM POINTER DELIM TAG_SUBM
1865 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1867 if (xr == NULL) HANDLE_ERROR;
1868 $<ctxt>$ = start_record(REC_SUBM,
1869 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1870 NULL, GEDCOM_MAKE_NULL(val2));
1871 START(SUBM, $1, $<ctxt>$) }
1875 { end_record(REC_SUBM, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1878 subm_subs : /* empty */
1879 | subm_subs subm_sub
1882 subm_sub : subm_name_sect { OCCUR2(NAME, 1, 1) }
1883 | addr_struc_sub /* 0:1 */
1884 | multim_link_sub /* 0:M */
1885 | subm_lang_sect { OCCUR2(LANG, 0, 3) }
1886 | subm_rfn_sect { OCCUR2(RFN, 0, 1) }
1887 | subm_rin_sect { OCCUR2(RIN, 0, 1) }
1888 | change_date_sub /* 0:1 */
1893 subm_name_sect : OPEN DELIM TAG_NAME mand_line_item
1894 { $<ctxt>$ = start_element(ELT_SUBM_NAME,
1896 GEDCOM_MAKE_STRING(val1, $4));
1897 START(NAME, $1, $<ctxt>$)
1902 { end_element(ELT_SUBM_NAME, PARENT, $<ctxt>5,
1903 GEDCOM_MAKE_NULL(val1));
1908 subm_lang_sect : OPEN DELIM TAG_LANG mand_line_item
1909 { $<ctxt>$ = start_element(ELT_SUBM_LANG,
1911 GEDCOM_MAKE_STRING(val1, $4));
1912 START(LANG, $1, $<ctxt>$)
1917 { end_element(ELT_SUBM_LANG, PARENT, $<ctxt>5,
1918 GEDCOM_MAKE_NULL(val1));
1923 subm_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1924 { $<ctxt>$ = start_element(ELT_SUBM_RFN,
1926 GEDCOM_MAKE_STRING(val1, $4));
1927 START(RFN, $1, $<ctxt>$)
1932 { end_element(ELT_SUBM_RFN, PARENT, $<ctxt>5,
1933 GEDCOM_MAKE_NULL(val1));
1938 subm_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1939 { $<ctxt>$ = start_element(ELT_SUBM_RIN,
1941 GEDCOM_MAKE_STRING(val1, $4));
1942 START(RIN, $1, $<ctxt>$)
1947 { end_element(ELT_SUBM_RIN, PARENT, $<ctxt>5,
1948 GEDCOM_MAKE_NULL(val1));
1952 /*********************************************************************/
1953 /**** Substructures ****/
1954 /*********************************************************************/
1956 /* ADDRESS STRUCTURE */
1957 addr_struc_sub : addr_sect { OCCUR2(ADDR, 0, 1) }
1958 | phon_sect { OCCUR2(PHON, 0, 3) }
1961 addr_sect : OPEN DELIM TAG_ADDR mand_line_item
1962 { $<ctxt>$ = start_element(ELT_SUB_ADDR,
1964 GEDCOM_MAKE_STRING(val1, $4));
1965 reset_buffer(&concat_buffer);
1966 safe_buf_append(&concat_buffer, $4);
1967 START(ADDR, $1, $<ctxt>$)
1972 { char* complete = get_buf_string(&concat_buffer);
1973 end_element(ELT_SUB_ADDR, PARENT, $<ctxt>5,
1974 GEDCOM_MAKE_STRING(val1, complete));
1978 addr_subs : /* empty */
1979 | addr_subs addr_sub
1982 addr_sub : addr_cont_sect /* 0:M */
1983 | addr_adr1_sect { OCCUR2(ADR1, 0, 1) }
1984 | addr_adr2_sect { OCCUR2(ADR2, 0, 1) }
1985 | addr_city_sect { OCCUR2(CITY, 0, 1) }
1986 | addr_stae_sect { OCCUR2(STAE, 0, 1) }
1987 | addr_post_sect { OCCUR2(POST, 0, 1) }
1988 | addr_ctry_sect { OCCUR2(CTRY, 0, 1) }
1992 addr_cont_sect : OPEN DELIM TAG_CONT mand_line_item
1993 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CONT,
1995 GEDCOM_MAKE_STRING(val1, $4));
1996 SAFE_BUF_ADDCHAR(&concat_buffer, '\n');
1997 safe_buf_append(&concat_buffer, $4);
1998 START(CONT, $1, $<ctxt>$)
2003 { end_element(ELT_SUB_ADDR_CONT, PARENT, $<ctxt>5,
2004 GEDCOM_MAKE_NULL(val1));
2007 addr_adr1_sect : OPEN DELIM TAG_ADR1 mand_line_item
2008 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR1,
2010 GEDCOM_MAKE_STRING(val1, $4));
2011 START(ADR1, $1, $<ctxt>$)
2016 { end_element(ELT_SUB_ADDR_ADR1, PARENT, $<ctxt>5,
2017 GEDCOM_MAKE_NULL(val1));
2020 addr_adr2_sect : OPEN DELIM TAG_ADR2 mand_line_item
2021 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR2,
2023 GEDCOM_MAKE_STRING(val1, $4));
2024 START(ADR2, $1, $<ctxt>$)
2029 { end_element(ELT_SUB_ADDR_ADR2, PARENT, $<ctxt>5,
2030 GEDCOM_MAKE_NULL(val1));
2033 addr_city_sect : OPEN DELIM TAG_CITY mand_line_item
2034 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CITY,
2036 GEDCOM_MAKE_STRING(val1, $4));
2037 START(CITY, $1, $<ctxt>$)
2042 { end_element(ELT_SUB_ADDR_CITY, PARENT, $<ctxt>5,
2043 GEDCOM_MAKE_NULL(val1));
2046 addr_stae_sect : OPEN DELIM TAG_STAE mand_line_item
2047 { $<ctxt>$ = start_element(ELT_SUB_ADDR_STAE,
2049 GEDCOM_MAKE_STRING(val1, $4));
2050 START(STAE, $1, $<ctxt>$)
2055 { end_element(ELT_SUB_ADDR_STAE, PARENT, $<ctxt>5,
2056 GEDCOM_MAKE_NULL(val1));
2059 addr_post_sect : OPEN DELIM TAG_POST mand_line_item
2060 { $<ctxt>$ = start_element(ELT_SUB_ADDR_POST,
2062 GEDCOM_MAKE_STRING(val1, $4));
2063 START(POST, $1, $<ctxt>$)
2068 { end_element(ELT_SUB_ADDR_POST, PARENT, $<ctxt>5,
2069 GEDCOM_MAKE_NULL(val1));
2072 addr_ctry_sect : OPEN DELIM TAG_CTRY mand_line_item
2073 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CTRY,
2075 GEDCOM_MAKE_STRING(val1, $4));
2076 START(CTRY, $1, $<ctxt>$)
2081 { end_element(ELT_SUB_ADDR_CTRY, PARENT, $<ctxt>5,
2082 GEDCOM_MAKE_NULL(val1));
2086 phon_sect : OPEN DELIM TAG_PHON mand_line_item
2087 { $<ctxt>$ = start_element(ELT_SUB_PHON,
2089 GEDCOM_MAKE_STRING(val1, $4));
2090 START(PHON, $1, $<ctxt>$)
2095 { end_element(ELT_SUB_PHON, PARENT, $<ctxt>5,
2096 GEDCOM_MAKE_NULL(val1));
2100 /* ASSOCIATION STRUCTURE */
2101 assoc_struc_sub : asso_sect /* 0:M */
2104 asso_sect : OPEN DELIM TAG_ASSO mand_pointer
2105 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2107 if (xr == NULL) HANDLE_ERROR;
2108 $<ctxt>$ = start_element(ELT_SUB_ASSO,
2110 GEDCOM_MAKE_XREF_PTR(val1, xr));
2111 START(ASSO, $1, $<ctxt>$)
2114 { CHECK2(TYPE,RELA) }
2116 { end_element(ELT_SUB_ASSO, PARENT, $<ctxt>5,
2117 GEDCOM_MAKE_NULL(val1));
2121 asso_subs : /* empty */
2122 | asso_type_sect { OCCUR2(TYPE, 1, 1) }
2123 | asso_rela_sect { OCCUR2(RELA, 1, 1) }
2129 asso_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2130 { $<ctxt>$ = start_element(ELT_SUB_ASSO_TYPE,
2132 GEDCOM_MAKE_STRING(val1, $4));
2133 START(TYPE, $1, $<ctxt>$)
2138 { end_element(ELT_SUB_ASSO_TYPE, PARENT, $<ctxt>5,
2139 GEDCOM_MAKE_NULL(val1));
2143 asso_rela_sect : OPEN DELIM TAG_RELA mand_line_item
2144 { $<ctxt>$ = start_element(ELT_SUB_ASSO_RELA,
2146 GEDCOM_MAKE_STRING(val1, $4));
2147 START(RELA, $1, $<ctxt>$)
2152 { end_element(ELT_SUB_ASSO_RELA, PARENT, $<ctxt>5,
2153 GEDCOM_MAKE_NULL(val1));
2158 change_date_sub : change_date_chan_sect { OCCUR2(CHAN, 0, 1) }
2161 change_date_chan_sect : OPEN DELIM TAG_CHAN
2162 { $<ctxt>$ = start_element(ELT_SUB_CHAN,
2163 PARENT, $1, $3, NULL,
2164 GEDCOM_MAKE_NULL(val1));
2165 START(CHAN, $1, $<ctxt>$)
2167 change_date_chan_subs
2170 { end_element(ELT_SUB_CHAN, PARENT, $<ctxt>4,
2171 GEDCOM_MAKE_NULL(val1));
2175 change_date_chan_subs : /* empty */
2176 | change_date_chan_subs change_date_chan_sub
2179 change_date_chan_sub : change_date_date_sect { OCCUR2(DATE, 1, 1) }
2184 change_date_date_sect : OPEN DELIM TAG_DATE mand_line_item
2185 { struct date_value dv = gedcom_parse_date($4);
2186 $<ctxt>$ = start_element(ELT_SUB_CHAN_DATE,
2188 GEDCOM_MAKE_DATE(val1, dv));
2189 START(DATE, $1, $<ctxt>$) }
2190 change_date_date_subs
2193 { end_element(ELT_SUB_CHAN_DATE, PARENT, $<ctxt>5,
2194 GEDCOM_MAKE_NULL(val1));
2198 change_date_date_subs : /* empty */
2199 | change_date_date_subs change_date_date_sub
2202 change_date_date_sub : change_date_date_time_sect { OCCUR2(TIME, 0, 1) }
2206 change_date_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
2208 = start_element(ELT_SUB_CHAN_TIME,
2210 GEDCOM_MAKE_STRING(val1, $4));
2211 START(TIME, $1, $<ctxt>$)
2216 { end_element(ELT_SUB_CHAN_TIME, PARENT, $<ctxt>5,
2217 GEDCOM_MAKE_NULL(val1));
2221 /* CHILD TO FAMILY LINK */
2222 chi_fam_link_sub : famc_sect /* 0:M */
2225 famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2226 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2228 if (xr == NULL) HANDLE_ERROR;
2229 $<ctxt>$ = start_element(ELT_SUB_FAMC,
2231 GEDCOM_MAKE_XREF_PTR(val1, xr));
2232 START(FAMC, $1, $<ctxt>$)
2237 { end_element(ELT_SUB_FAMC, PARENT, $<ctxt>5,
2238 GEDCOM_MAKE_NULL(val1));
2242 famc_subs : /* empty */
2243 | famc_subs famc_sub
2246 famc_sub : famc_pedi_sect /* 0:M */
2251 famc_pedi_sect : OPEN DELIM TAG_PEDI mand_line_item
2252 { $<ctxt>$ = start_element(ELT_SUB_FAMC_PEDI,
2254 GEDCOM_MAKE_STRING(val1, $4));
2255 START(PEDI, $1, $<ctxt>$)
2260 { end_element(ELT_SUB_FAMC_PEDI, PARENT, $<ctxt>5,
2261 GEDCOM_MAKE_NULL(val1));
2265 /* CONTINUATION SUBSECTIONS */
2266 continuation_sub : cont_sect /* 0:M */
2267 | conc_sect /* 0:M */
2270 cont_sect : OPEN DELIM TAG_CONT mand_line_item
2271 { $<ctxt>$ = start_element(ELT_SUB_CONT,
2273 GEDCOM_MAKE_STRING(val1, $4));
2274 SAFE_BUF_ADDCHAR(&concat_buffer, '\n');
2275 safe_buf_append(&concat_buffer, $4);
2276 START(CONT, $1, $<ctxt>$)
2281 { end_element(ELT_SUB_CONT, PARENT, $<ctxt>5,
2282 GEDCOM_MAKE_NULL(val1));
2286 conc_sect : OPEN DELIM TAG_CONC mand_line_item
2287 { $<ctxt>$ = start_element(ELT_SUB_CONC,
2289 GEDCOM_MAKE_STRING(val1, $4));
2290 safe_buf_append(&concat_buffer, $4);
2291 START(CONC, $1, $<ctxt>$)
2296 { end_element(ELT_SUB_CONC, PARENT, $<ctxt>5,
2297 GEDCOM_MAKE_NULL(val1));
2302 event_detail_sub : event_detail_type_sect { OCCUR2(TYPE, 0, 1) }
2303 | event_detail_date_sect { OCCUR2(DATE, 0, 1) }
2306 | event_detail_age_sect { OCCUR2(AGE, 0, 1) }
2307 | event_detail_agnc_sect { OCCUR2(AGNC, 0, 1) }
2308 | event_detail_caus_sect { OCCUR2(CAUS, 0, 1) }
2314 event_detail_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2316 = start_element(ELT_SUB_EVT_TYPE,
2318 GEDCOM_MAKE_STRING(val1, $4));
2319 START(TYPE, $1, $<ctxt>$)
2324 { end_element(ELT_SUB_EVT_TYPE, PARENT, $<ctxt>5,
2325 GEDCOM_MAKE_NULL(val1));
2328 event_detail_date_sect : OPEN DELIM TAG_DATE mand_line_item
2329 { struct date_value dv = gedcom_parse_date($4);
2331 = start_element(ELT_SUB_EVT_DATE,
2333 GEDCOM_MAKE_DATE(val1, dv));
2334 START(DATE, $1, $<ctxt>$)
2339 { end_element(ELT_SUB_EVT_DATE, PARENT, $<ctxt>5,
2340 GEDCOM_MAKE_NULL(val1));
2343 event_detail_age_sect : OPEN DELIM TAG_AGE mand_line_item
2344 { struct age_value age = gedcom_parse_age($4);
2346 = start_element(ELT_SUB_EVT_AGE,
2348 GEDCOM_MAKE_AGE(val1, age));
2349 START(AGE, $1, $<ctxt>$)
2354 { end_element(ELT_SUB_EVT_AGE, PARENT, $<ctxt>5,
2355 GEDCOM_MAKE_NULL(val1));
2358 event_detail_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
2360 = start_element(ELT_SUB_EVT_AGNC,
2362 GEDCOM_MAKE_STRING(val1, $4));
2363 START(AGNC, $1, $<ctxt>$)
2368 { end_element(ELT_SUB_EVT_AGNC, PARENT, $<ctxt>5,
2369 GEDCOM_MAKE_NULL(val1));
2372 event_detail_caus_sect : OPEN DELIM TAG_CAUS mand_line_item
2374 = start_element(ELT_SUB_EVT_CAUS,
2376 GEDCOM_MAKE_STRING(val1, $4));
2377 START(CAUS, $1, $<ctxt>$)
2382 { end_element(ELT_SUB_EVT_CAUS, PARENT, $<ctxt>5,
2383 GEDCOM_MAKE_NULL(val1));
2387 /* FAMILY EVENT STRUCTURE */
2388 fam_event_struc_sub : fam_event_sect
2389 | fam_gen_even_sect /* 0:M */
2392 fam_event_sect : OPEN DELIM fam_event_tag opt_value
2394 = start_element(ELT_SUB_FAM_EVT,
2396 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2397 START2($1, $<ctxt>$);
2402 { end_element(ELT_SUB_FAM_EVT, PARENT, $<ctxt>5,
2403 GEDCOM_MAKE_NULL(val1));
2407 fam_event_tag : TAG_ANUL { $$ = $1; START1(ANUL) }
2408 | TAG_CENS { $$ = $1; START1(CENS) }
2409 | TAG_DIV { $$ = $1; START1(DIV) }
2410 | TAG_DIVF { $$ = $1; START1(DIVF) }
2411 | TAG_ENGA { $$ = $1; START1(ENGA) }
2412 | TAG_MARR { $$ = $1; START1(MARR) }
2413 | TAG_MARB { $$ = $1; START1(MARB) }
2414 | TAG_MARC { $$ = $1; START1(MARC) }
2415 | TAG_MARL { $$ = $1; START1(MARL) }
2416 | TAG_MARS { $$ = $1; START1(MARS) }
2419 fam_event_subs : /* empty */
2420 | fam_event_subs fam_event_sub
2423 fam_event_sub : event_detail_sub
2424 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2425 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2429 fam_even_husb_sect : OPEN DELIM TAG_HUSB
2430 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_HUSB,
2431 PARENT, $1, $3, NULL,
2432 GEDCOM_MAKE_NULL(val1));
2433 START(HUSB, $1, $<ctxt>$)
2438 { end_element(ELT_SUB_FAM_EVT_HUSB, PARENT, $<ctxt>4,
2439 GEDCOM_MAKE_NULL(val1));
2443 fam_even_husb_subs : /* empty */
2444 | fam_even_husb_subs fam_even_husb_sub
2447 fam_even_husb_sub : fam_even_age_sect { OCCUR2(AGE, 1, 1) }
2451 fam_even_age_sect : OPEN DELIM TAG_AGE mand_line_item
2452 { struct age_value age = gedcom_parse_age($4);
2453 $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_AGE,
2455 GEDCOM_MAKE_AGE(val1, age));
2456 START(AGE, $1, $<ctxt>$)
2461 { end_element(ELT_SUB_FAM_EVT_AGE, PARENT, $<ctxt>5,
2462 GEDCOM_MAKE_NULL(val1));
2466 fam_even_wife_sect : OPEN DELIM TAG_WIFE
2467 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_WIFE,
2468 PARENT, $1, $3, NULL,
2469 GEDCOM_MAKE_NULL(val1));
2470 START(WIFE, $1, $<ctxt>$)
2475 { end_element(ELT_SUB_FAM_EVT_WIFE, PARENT, $<ctxt>4,
2476 GEDCOM_MAKE_NULL(val1));
2480 fam_gen_even_sect : OPEN DELIM TAG_EVEN
2481 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_EVEN,
2482 PARENT, $1, $3, NULL,
2483 GEDCOM_MAKE_NULL(val1));
2484 START(EVEN, $1, $<ctxt>$)
2489 { end_element(ELT_SUB_FAM_EVT_EVEN, PARENT, $<ctxt>4,
2490 GEDCOM_MAKE_NULL(val1));
2494 fam_gen_even_subs : /* empty */
2495 | fam_gen_even_subs fam_gen_even_sub
2498 fam_gen_even_sub : event_detail_sub
2499 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2500 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2504 /* IDENTIFICATION STRUCTURE */
2505 ident_struc_sub : ident_refn_sect /* 0:M */
2506 | ident_rin_sect { OCCUR2(RIN, 0, 1) }
2509 ident_refn_sect : OPEN DELIM TAG_REFN mand_line_item
2510 { $<ctxt>$ = start_element(ELT_SUB_IDENT_REFN,
2512 GEDCOM_MAKE_STRING(val1, $4));
2513 START(REFN, $1, $<ctxt>$)
2518 { end_element(ELT_SUB_IDENT_REFN, PARENT, $<ctxt>5,
2519 GEDCOM_MAKE_NULL(val1));
2523 ident_refn_subs : /* empty */
2524 | ident_refn_subs ident_refn_sub
2527 ident_refn_sub : ident_refn_type_sect { OCCUR2(TYPE, 0, 1) }
2531 ident_refn_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2533 = start_element(ELT_SUB_IDENT_REFN_TYPE,
2535 GEDCOM_MAKE_STRING(val1, $4));
2536 START(TYPE, $1, $<ctxt>$)
2541 { end_element(ELT_SUB_IDENT_REFN_TYPE, PARENT, $<ctxt>5,
2542 GEDCOM_MAKE_NULL(val1));
2546 ident_rin_sect : OPEN DELIM TAG_RIN mand_line_item
2547 { $<ctxt>$ = start_element(ELT_SUB_IDENT_RIN,
2549 GEDCOM_MAKE_STRING(val1, $4));
2550 START(RIN, $1, $<ctxt>$)
2555 { end_element(ELT_SUB_IDENT_RIN, PARENT, $<ctxt>5,
2556 GEDCOM_MAKE_NULL(val1));
2560 /* INDIVIDUAL ATTRIBUTE STRUCTURE */
2561 indiv_attr_struc_sub : indiv_attr_sect /* 0:M */
2562 | indiv_resi_sect /* 0:M */
2565 indiv_attr_sect : OPEN DELIM indiv_attr_tag mand_line_item
2566 { $<ctxt>$ = start_element(ELT_SUB_INDIV_ATTR,
2568 GEDCOM_MAKE_STRING(val1, $4));
2569 START2($1, $<ctxt>$);
2571 indiv_attr_event_subs
2574 { end_element(ELT_SUB_INDIV_ATTR, PARENT, $<ctxt>5,
2575 GEDCOM_MAKE_NULL(val1));
2579 indiv_attr_tag : TAG_CAST { $$ = $1; START1(CAST) }
2580 | TAG_DSCR { $$ = $1; START1(DSCR) }
2581 | TAG_EDUC { $$ = $1; START1(EDUC) }
2582 | TAG_IDNO { $$ = $1; START1(IDNO) }
2583 | TAG_NATI { $$ = $1; START1(NATI) }
2584 | TAG_NCHI { $$ = $1; START1(NCHI) }
2585 | TAG_NMR { $$ = $1; START1(NMR) }
2586 | TAG_OCCU { $$ = $1; START1(OCCU) }
2587 | TAG_PROP { $$ = $1; START1(PROP) }
2588 | TAG_RELI { $$ = $1; START1(RELI) }
2589 | TAG_SSN { $$ = $1; START1(SSN) }
2590 | TAG_TITL { $$ = $1; START1(TITL) }
2593 indiv_resi_sect : OPEN DELIM TAG_RESI
2594 { $<ctxt>$ = start_element(ELT_SUB_INDIV_RESI,
2595 PARENT, $1, $3, NULL,
2596 GEDCOM_MAKE_NULL(val1));
2597 START(RESI, $1, $<ctxt>$)
2599 indiv_attr_event_subs
2602 { end_element(ELT_SUB_INDIV_RESI, PARENT, $<ctxt>4,
2603 GEDCOM_MAKE_NULL(val1));
2607 indiv_attr_event_subs : /* empty */
2608 | indiv_attr_event_subs indiv_attr_event_sub
2611 indiv_attr_event_sub : event_detail_sub
2615 /* INDIVIDUAL EVENT STRUCTURE */
2616 indiv_even_struc_sub : indiv_birt_sect
2618 | indiv_adop_sect /* 0:M */
2619 | indiv_even_sect /* 0:M */
2622 indiv_birt_sect : OPEN DELIM indiv_birt_tag opt_value
2624 = start_element(ELT_SUB_INDIV_BIRT,
2626 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2627 START2($1, $<ctxt>$);
2632 { end_element(ELT_SUB_INDIV_BIRT, PARENT, $<ctxt>5,
2633 GEDCOM_MAKE_NULL(val1));
2637 indiv_birt_tag : TAG_BIRT { $$ = $1; START1(BIRT) }
2638 | TAG_CHR { $$ = $1; START1(CHR) }
2641 indiv_birt_subs : /* empty */
2642 | indiv_birt_subs indiv_birt_sub
2645 indiv_birt_sub : event_detail_sub
2646 | indiv_birt_famc_sect { OCCUR2(FAMC,0, 1) }
2650 indiv_birt_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2651 { struct xref_value *xr = gedcom_parse_xref($4,
2654 if (xr == NULL) HANDLE_ERROR;
2656 = start_element(ELT_SUB_INDIV_BIRT_FAMC,
2658 GEDCOM_MAKE_XREF_PTR(val1, xr));
2659 START(FAMC, $1, $<ctxt>$)
2664 { end_element(ELT_SUB_INDIV_BIRT_FAMC, PARENT, $<ctxt>5,
2665 GEDCOM_MAKE_NULL(val1));
2669 indiv_gen_sect : OPEN DELIM indiv_gen_tag opt_value
2671 = start_element(ELT_SUB_INDIV_GEN,
2673 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2674 START2($1, $<ctxt>$);
2679 { end_element(ELT_SUB_INDIV_GEN, PARENT, $<ctxt>5,
2680 GEDCOM_MAKE_NULL(val1));
2684 indiv_gen_tag : TAG_DEAT { $$ = $1; START1(DEAT) }
2685 | TAG_BURI { $$ = $1; START1(BURI) }
2686 | TAG_CREM { $$ = $1; START1(CREM) }
2687 | TAG_BAPM { $$ = $1; START1(BAPM) }
2688 | TAG_BARM { $$ = $1; START1(BARM) }
2689 | TAG_BASM { $$ = $1; START1(BASM) }
2690 | TAG_BLES { $$ = $1; START1(BLES) }
2691 | TAG_CHRA { $$ = $1; START1(CHRA) }
2692 | TAG_CONF { $$ = $1; START1(CONF) }
2693 | TAG_FCOM { $$ = $1; START1(FCOM) }
2694 | TAG_ORDN { $$ = $1; START1(ORDN) }
2695 | TAG_NATU { $$ = $1; START1(NATU) }
2696 | TAG_EMIG { $$ = $1; START1(EMIG) }
2697 | TAG_IMMI { $$ = $1; START1(IMMI) }
2698 | TAG_CENS { $$ = $1; START1(CENS) }
2699 | TAG_PROB { $$ = $1; START1(PROB) }
2700 | TAG_WILL { $$ = $1; START1(WILL) }
2701 | TAG_GRAD { $$ = $1; START1(GRAD) }
2702 | TAG_RETI { $$ = $1; START1(RETI) }
2705 indiv_gen_subs : /* empty */
2706 | indiv_gen_subs indiv_gen_sub
2709 indiv_gen_sub : event_detail_sub
2713 indiv_adop_sect : OPEN DELIM TAG_ADOP opt_value
2715 = start_element(ELT_SUB_INDIV_ADOP,
2717 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2718 START(ADOP, $1, $<ctxt>$) }
2722 { end_element(ELT_SUB_INDIV_ADOP, PARENT, $<ctxt>5,
2723 GEDCOM_MAKE_NULL(val1));
2727 indiv_adop_subs : /* empty */
2728 | indiv_adop_subs indiv_adop_sub
2731 indiv_adop_sub : event_detail_sub
2732 | indiv_adop_famc_sect { OCCUR2(FAMC,0, 1) }
2736 indiv_adop_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2737 { struct xref_value *xr = gedcom_parse_xref($4,
2740 if (xr == NULL) HANDLE_ERROR;
2742 = start_element(ELT_SUB_INDIV_ADOP_FAMC,
2744 GEDCOM_MAKE_XREF_PTR(val1, xr));
2745 START(FAMC, $1, $<ctxt>$) }
2746 indiv_adop_famc_subs
2749 { end_element(ELT_SUB_INDIV_ADOP_FAMC, PARENT, $<ctxt>5,
2750 GEDCOM_MAKE_NULL(val1));
2754 indiv_adop_famc_subs : /* empty */
2755 | indiv_adop_famc_subs indiv_adop_famc_sub
2758 indiv_adop_famc_sub : indiv_adop_famc_adop_sect { OCCUR2(ADOP,0, 1) }
2762 indiv_adop_famc_adop_sect : OPEN DELIM TAG_ADOP mand_line_item
2764 = start_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2766 GEDCOM_MAKE_STRING(val1, $4));
2767 START(ADOP, $1, $<ctxt>$) }
2771 { end_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2773 GEDCOM_MAKE_NULL(val1));
2777 indiv_even_sect : OPEN DELIM TAG_EVEN
2778 { $<ctxt>$ = start_element(ELT_SUB_INDIV_EVEN,
2779 PARENT, $1, $3, NULL,
2780 GEDCOM_MAKE_NULL(val1));
2781 START(EVEN, $1, $<ctxt>$) }
2785 { end_element(ELT_SUB_INDIV_EVEN, PARENT, $<ctxt>4,
2786 GEDCOM_MAKE_NULL(val1));
2790 /* LDS INDIVIDUAL ORDINANCE */
2791 lds_indiv_ord_sub : lio_bapl_sect /* 0:M */
2792 | lio_slgc_sect /* 0:M */
2795 lio_bapl_sect : OPEN DELIM lio_bapl_tag
2796 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL,
2797 PARENT, $1, $3, NULL,
2798 GEDCOM_MAKE_NULL(val1));
2799 START2($1, $<ctxt>$);
2804 { end_element(ELT_SUB_LIO_BAPL, PARENT, $<ctxt>4,
2805 GEDCOM_MAKE_NULL(val1));
2809 lio_bapl_tag : TAG_BAPL { $$ = $1; START1(BAPL) }
2810 | TAG_CONL { $$ = $1; START1(CONL) }
2811 | TAG_ENDL { $$ = $1; START1(ENDL) }
2814 lio_bapl_subs : /* empty */
2815 | lio_bapl_subs lio_bapl_sub
2818 lio_bapl_sub : lio_bapl_stat_sect { OCCUR2(STAT, 0, 1) }
2819 | lio_bapl_date_sect { OCCUR2(DATE, 0, 1) }
2820 | lio_bapl_temp_sect { OCCUR2(TEMP, 0, 1) }
2821 | lio_bapl_plac_sect { OCCUR2(PLAC, 0, 1) }
2827 lio_bapl_stat_sect : OPEN DELIM TAG_STAT mand_line_item
2828 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_STAT,
2830 GEDCOM_MAKE_STRING(val1, $4));
2831 START(STAT, $1, $<ctxt>$)
2836 { end_element(ELT_SUB_LIO_BAPL_STAT, PARENT, $<ctxt>5,
2837 GEDCOM_MAKE_NULL(val1));
2840 lio_bapl_date_sect : OPEN DELIM TAG_DATE mand_line_item
2841 { struct date_value dv = gedcom_parse_date($4);
2842 $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_DATE,
2844 GEDCOM_MAKE_DATE(val1, dv));
2845 START(DATE, $1, $<ctxt>$)
2850 { end_element(ELT_SUB_LIO_BAPL_DATE, PARENT, $<ctxt>5,
2851 GEDCOM_MAKE_NULL(val1));
2854 lio_bapl_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
2855 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_TEMP,
2857 GEDCOM_MAKE_STRING(val1, $4));
2858 START(TEMP, $1, $<ctxt>$)
2863 { end_element(ELT_SUB_LIO_BAPL_TEMP, PARENT, $<ctxt>5,
2864 GEDCOM_MAKE_NULL(val1));
2867 lio_bapl_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
2868 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_PLAC,
2870 GEDCOM_MAKE_STRING(val1, $4));
2871 START(PLAC, $1, $<ctxt>$)
2876 { end_element(ELT_SUB_LIO_BAPL_PLAC, PARENT, $<ctxt>5,
2877 GEDCOM_MAKE_NULL(val1));
2881 lio_slgc_sect : OPEN DELIM TAG_SLGC
2882 { $<ctxt>$ = start_element(ELT_SUB_LIO_SLGC,
2883 PARENT, $1, $3, NULL,
2884 GEDCOM_MAKE_NULL(val1));
2885 START(SLGC, $1, $<ctxt>$)
2890 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4,
2891 GEDCOM_MAKE_NULL(val1));
2895 lio_slgc_subs : /* empty */
2896 | lio_slgc_subs lio_slgc_sub
2899 lio_slgc_sub : lio_bapl_sub
2900 | lio_slgc_famc_sect { OCCUR2(FAMC, 1, 1) }
2903 lio_slgc_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2904 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2906 if (xr == NULL) HANDLE_ERROR;
2908 = start_element(ELT_SUB_LIO_SLGC_FAMC,
2910 GEDCOM_MAKE_XREF_PTR(val1, xr));
2911 START(FAMC, $1, $<ctxt>$)
2916 { end_element(ELT_SUB_LIO_SLGC_FAMC, PARENT, $<ctxt>5,
2917 GEDCOM_MAKE_NULL(val1));
2921 /* LDS SPOUSE SEALING */
2922 lds_spouse_seal_sub : lss_slgs_sect
2925 lss_slgs_sect : OPEN DELIM TAG_SLGS
2926 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS,
2927 PARENT, $1, $3, NULL,
2928 GEDCOM_MAKE_NULL(val1));
2929 START(SLGS, $1, $<ctxt>$) }
2933 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4,
2934 GEDCOM_MAKE_NULL(val1));
2938 lss_slgs_subs : /* empty */
2939 | lss_slgs_subs lss_slgs_sub
2942 lss_slgs_sub : lss_slgs_stat_sect { OCCUR2(STAT, 0, 1) }
2943 | lss_slgs_date_sect { OCCUR2(DATE, 0, 1) }
2944 | lss_slgs_temp_sect { OCCUR2(TEMP, 0, 1) }
2945 | lss_slgs_plac_sect { OCCUR2(PLAC, 0, 1) }
2951 lss_slgs_stat_sect : OPEN DELIM TAG_STAT mand_line_item
2952 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_STAT,
2954 GEDCOM_MAKE_STRING(val1, $4));
2955 START(STAT, $1, $<ctxt>$)
2960 { end_element(ELT_SUB_LSS_SLGS_STAT, PARENT, $<ctxt>5,
2961 GEDCOM_MAKE_NULL(val1));
2964 lss_slgs_date_sect : OPEN DELIM TAG_DATE mand_line_item
2965 { struct date_value dv = gedcom_parse_date($4);
2966 $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_DATE,
2968 GEDCOM_MAKE_DATE(val1, dv));
2969 START(DATE, $1, $<ctxt>$)
2974 { end_element(ELT_SUB_LSS_SLGS_DATE, PARENT, $<ctxt>5,
2975 GEDCOM_MAKE_NULL(val1));
2978 lss_slgs_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
2979 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_TEMP,
2981 GEDCOM_MAKE_STRING(val1, $4));
2982 START(TEMP, $1, $<ctxt>$)
2987 { end_element(ELT_SUB_LSS_SLGS_TEMP, PARENT, $<ctxt>5,
2988 GEDCOM_MAKE_NULL(val1));
2991 lss_slgs_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
2992 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_PLAC,
2994 GEDCOM_MAKE_STRING(val1, $4));
2995 START(PLAC, $1, $<ctxt>$)
3000 { end_element(ELT_SUB_LSS_SLGS_PLAC, PARENT, $<ctxt>5,
3001 GEDCOM_MAKE_NULL(val1));
3005 /* MULTIMEDIA LINK */
3006 multim_link_sub : multim_obje_link_sect
3007 | multim_obje_emb_sect
3010 multim_obje_link_sect : OPEN DELIM TAG_OBJE DELIM POINTER
3011 { struct xref_value *xr = gedcom_parse_xref($5,
3014 if (xr == NULL) HANDLE_ERROR;
3016 = start_element(ELT_SUB_MULTIM_OBJE,
3018 GEDCOM_MAKE_XREF_PTR(val1, xr));
3019 START(OBJE, $1, $<ctxt>$)
3024 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>6,
3025 GEDCOM_MAKE_NULL(val1));
3029 multim_obje_emb_sect : OPEN DELIM TAG_OBJE
3030 { $<ctxt>$ = start_element(ELT_SUB_MULTIM_OBJE,
3031 PARENT, $1, $3, NULL,
3032 GEDCOM_MAKE_NULL(val1));
3033 START(OBJE, $1, $<ctxt>$)
3035 multim_obje_emb_subs
3036 { CHECK2(FORM,FILE) }
3038 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>4,
3039 GEDCOM_MAKE_NULL(val1));
3043 multim_obje_emb_subs : /* empty */
3044 | multim_obje_emb_subs multim_obje_emb_sub
3047 multim_obje_emb_sub : multim_obje_form_sect { OCCUR2(FORM, 1, 1) }
3048 | multim_obje_titl_sect { OCCUR2(TITL, 0, 1) }
3049 | multim_obje_file_sect { OCCUR2(FILE, 1, 1) }
3054 multim_obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
3056 = start_element(ELT_SUB_MULTIM_OBJE_FORM,
3058 GEDCOM_MAKE_STRING(val1, $4));
3059 START(FORM, $1, $<ctxt>$)
3064 { end_element(ELT_SUB_MULTIM_OBJE_FORM,
3066 GEDCOM_MAKE_NULL(val1));
3069 multim_obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
3071 = start_element(ELT_SUB_MULTIM_OBJE_TITL,
3073 GEDCOM_MAKE_STRING(val1, $4));
3074 START(TITL, $1, $<ctxt>$)
3079 { end_element(ELT_SUB_MULTIM_OBJE_TITL,
3081 GEDCOM_MAKE_NULL(val1));
3084 multim_obje_file_sect : OPEN DELIM TAG_FILE mand_line_item
3086 = start_element(ELT_SUB_MULTIM_OBJE_FILE,
3088 GEDCOM_MAKE_STRING(val1, $4));
3089 START(FILE, $1, $<ctxt>$)
3094 { end_element(ELT_SUB_MULTIM_OBJE_FILE,
3096 GEDCOM_MAKE_NULL(val1));
3100 /* NOTE STRUCTURE */
3101 note_struc_sub : note_struc_link_sect /* 0:M */
3102 | note_struc_emb_sect /* 0:M */
3105 note_struc_link_sect : OPEN DELIM TAG_NOTE DELIM POINTER
3106 { struct xref_value *xr = gedcom_parse_xref($5,
3109 if (xr == NULL) HANDLE_ERROR;
3111 = start_element(ELT_SUB_NOTE,
3113 GEDCOM_MAKE_XREF_PTR(val1, xr));
3114 START(NOTE, $1, $<ctxt>$)
3116 note_struc_link_subs
3119 { end_element(ELT_SUB_NOTE, PARENT, $<ctxt>6,
3120 GEDCOM_MAKE_NULL(val1));
3124 note_struc_link_subs : /* empty */
3125 | note_struc_link_subs note_struc_link_sub
3128 note_struc_link_sub : source_cit_sub
3132 note_struc_emb_sect : OPEN DELIM TAG_NOTE opt_line_item
3134 = start_element(ELT_SUB_NOTE,
3136 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
3137 reset_buffer(&concat_buffer);
3139 safe_buf_append(&concat_buffer, $4);
3140 START(NOTE, $1, $<ctxt>$)
3145 { char* complete = get_buf_string(&concat_buffer);
3146 end_element(ELT_SUB_NOTE, PARENT, $<ctxt>5,
3147 GEDCOM_MAKE_STRING(val1, complete));
3151 note_struc_emb_subs : /* empty */
3152 | note_struc_emb_subs note_struc_emb_sub
3155 note_struc_emb_sub : continuation_sub
3160 /* PERSONAL NAME STRUCTURE */
3161 pers_name_struc_sub : pers_name_sect /* 0:M */
3164 pers_name_sect : OPEN DELIM TAG_NAME mand_line_item
3165 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME,
3167 GEDCOM_MAKE_STRING(val1, $4));
3168 START(NAME, $1, $<ctxt>$)
3173 { end_element(ELT_SUB_PERS_NAME, PARENT, $<ctxt>5,
3174 GEDCOM_MAKE_NULL(val1));
3178 pers_name_subs : /* empty */
3179 | pers_name_subs pers_name_sub
3182 pers_name_sub : pers_name_npfx_sect { OCCUR2(NPFX, 0, 1) }
3183 | pers_name_givn_sect { OCCUR2(GIVN, 0, 1) }
3184 | pers_name_nick_sect { OCCUR2(NICK, 0, 1) }
3185 | pers_name_spfx_sect { OCCUR2(SPFX, 0, 1) }
3186 | pers_name_surn_sect { OCCUR2(SURN, 0, 1) }
3187 | pers_name_nsfx_sect { OCCUR2(NSFX, 0, 1) }
3193 pers_name_npfx_sect : OPEN DELIM TAG_NPFX mand_line_item
3194 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NPFX,
3196 GEDCOM_MAKE_STRING(val1, $4));
3197 START(NPFX, $1, $<ctxt>$)
3202 { end_element(ELT_SUB_PERS_NAME_NPFX, PARENT, $<ctxt>5,
3203 GEDCOM_MAKE_NULL(val1));
3206 pers_name_givn_sect : OPEN DELIM TAG_GIVN mand_line_item
3207 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_GIVN,
3209 GEDCOM_MAKE_STRING(val1, $4));
3210 START(GIVN, $1, $<ctxt>$)
3215 { end_element(ELT_SUB_PERS_NAME_GIVN, PARENT, $<ctxt>5,
3216 GEDCOM_MAKE_NULL(val1));
3219 pers_name_nick_sect : OPEN DELIM TAG_NICK mand_line_item
3220 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NICK,
3222 GEDCOM_MAKE_STRING(val1, $4));
3223 START(NICK, $1, $<ctxt>$)
3228 { end_element(ELT_SUB_PERS_NAME_NICK, PARENT, $<ctxt>5,
3229 GEDCOM_MAKE_NULL(val1));
3232 pers_name_spfx_sect : OPEN DELIM TAG_SPFX mand_line_item
3233 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SPFX,
3235 GEDCOM_MAKE_STRING(val1, $4));
3236 START(SPFX, $1, $<ctxt>$)
3241 { end_element(ELT_SUB_PERS_NAME_SPFX, PARENT, $<ctxt>5,
3242 GEDCOM_MAKE_NULL(val1));
3245 pers_name_surn_sect : OPEN DELIM TAG_SURN mand_line_item
3246 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SURN,
3248 GEDCOM_MAKE_STRING(val1, $4));
3249 START(SURN, $1, $<ctxt>$)
3254 { end_element(ELT_SUB_PERS_NAME_SURN, PARENT, $<ctxt>5,
3255 GEDCOM_MAKE_NULL(val1));
3258 pers_name_nsfx_sect : OPEN DELIM TAG_NSFX mand_line_item
3259 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NSFX,
3261 GEDCOM_MAKE_STRING(val1, $4));
3262 START(NSFX, $1, $<ctxt>$)
3267 { end_element(ELT_SUB_PERS_NAME_NSFX, PARENT, $<ctxt>5,
3268 GEDCOM_MAKE_NULL(val1));
3272 /* PLACE STRUCTURE */
3273 place_struc_sub : place_struc_plac_sect /* 0:M */
3276 place_struc_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
3278 = start_element(ELT_SUB_PLAC,
3280 GEDCOM_MAKE_STRING(val1, $4));
3281 START(PLAC, $1, $<ctxt>$)
3283 place_struc_plac_subs
3286 { end_element(ELT_SUB_PLAC, PARENT, $<ctxt>5,
3287 GEDCOM_MAKE_NULL(val1));
3291 place_struc_plac_subs : /* empty */
3292 | place_struc_plac_subs place_struc_plac_sub
3295 place_struc_plac_sub : place_plac_form_sect { OCCUR2(FORM, 0, 1) }
3301 place_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
3303 = start_element(ELT_SUB_PLAC_FORM,
3305 GEDCOM_MAKE_STRING(val1, $4));
3306 START(FORM, $1, $<ctxt>$)
3311 { end_element(ELT_SUB_PLAC_FORM, PARENT, $<ctxt>5,
3312 GEDCOM_MAKE_NULL(val1));
3316 /* SOURCE_CITATION */
3317 source_cit_sub : source_cit_link_sect /* 0:M */
3318 | source_cit_emb_sect /* 0:M */
3321 source_cit_link_sect : OPEN DELIM TAG_SOUR DELIM POINTER
3322 { struct xref_value *xr = gedcom_parse_xref($5,
3325 if (xr == NULL) HANDLE_ERROR;
3327 = start_element(ELT_SUB_SOUR,
3329 GEDCOM_MAKE_XREF_PTR(val1, xr));
3330 START(SOUR, $1, $<ctxt>$)
3332 source_cit_link_subs
3335 { end_element(ELT_SUB_SOUR, PARENT, $<ctxt>6,
3336 GEDCOM_MAKE_NULL(val1));
3340 source_cit_link_subs : /* empty */
3341 | source_cit_link_subs source_cit_link_sub
3344 source_cit_link_sub : source_cit_page_sect { OCCUR2(PAGE, 0, 1) }
3345 | source_cit_even_sect { OCCUR2(EVEN, 0, 1) }
3346 | source_cit_data_sect { OCCUR2(DATA, 0, 1) }
3347 | source_cit_quay_sect { OCCUR2(QUAY, 0, 1) }
3353 source_cit_page_sect : OPEN DELIM TAG_PAGE mand_line_item
3355 = start_element(ELT_SUB_SOUR_PAGE,
3357 GEDCOM_MAKE_STRING(val1, $4));
3358 START(PAGE, $1, $<ctxt>$)
3363 { end_element(ELT_SUB_SOUR_PAGE, PARENT, $<ctxt>5,
3364 GEDCOM_MAKE_NULL(val1));
3368 source_cit_even_sect : OPEN DELIM TAG_EVEN mand_line_item
3370 = start_element(ELT_SUB_SOUR_EVEN,
3372 GEDCOM_MAKE_STRING(val1, $4));
3373 START(EVEN, $1, $<ctxt>$)
3375 source_cit_even_subs
3378 { end_element(ELT_SUB_SOUR_EVEN, PARENT, $<ctxt>5,
3379 GEDCOM_MAKE_NULL(val1));
3383 source_cit_even_subs : /* empty */
3384 | source_cit_even_subs source_cit_even_sub
3387 source_cit_even_sub : source_cit_even_role_sect { OCCUR2(ROLE, 0, 1) }
3391 source_cit_even_role_sect : OPEN DELIM TAG_ROLE mand_line_item
3393 = start_element(ELT_SUB_SOUR_EVEN_ROLE,
3395 GEDCOM_MAKE_STRING(val1, $4));
3396 START(ROLE, $1, $<ctxt>$)
3401 { end_element(ELT_SUB_SOUR_EVEN_ROLE,
3403 GEDCOM_MAKE_NULL(val1));
3407 source_cit_data_sect : OPEN DELIM TAG_DATA
3408 { $<ctxt>$ = start_element(ELT_SUB_SOUR_DATA,
3409 PARENT, $1, $3, NULL,
3410 GEDCOM_MAKE_NULL(val1));
3411 START(DATA, $1, $<ctxt>$)
3413 source_cit_data_subs
3416 { end_element(ELT_SUB_SOUR_DATA, PARENT, $<ctxt>4,
3417 GEDCOM_MAKE_NULL(val1));
3421 source_cit_data_subs : /* empty */
3422 | source_cit_data_subs source_cit_data_sub
3425 source_cit_data_sub : source_cit_data_date_sect { OCCUR2(DATE, 0, 1) }
3426 | source_cit_text_sect /* 0:M */
3430 source_cit_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
3431 { struct date_value dv = gedcom_parse_date($4);
3433 = start_element(ELT_SUB_SOUR_DATA_DATE,
3435 GEDCOM_MAKE_DATE(val1, dv));
3436 START(DATE, $1, $<ctxt>$)
3441 { end_element(ELT_SUB_SOUR_DATA_DATE,
3443 GEDCOM_MAKE_NULL(val1));
3447 source_cit_text_sect : OPEN DELIM TAG_TEXT mand_line_item
3449 = start_element(ELT_SUB_SOUR_TEXT,
3451 GEDCOM_MAKE_STRING(val1, $4));
3452 reset_buffer(&concat_buffer);
3453 safe_buf_append(&concat_buffer, $4);
3454 START(TEXT, $1, $<ctxt>$)
3456 source_cit_text_subs
3459 { char* complete = get_buf_string(&concat_buffer);
3460 end_element(ELT_SUB_SOUR_TEXT, PARENT, $<ctxt>5,
3461 GEDCOM_MAKE_STRING(val1, complete));
3465 source_cit_text_subs : /* empty */
3466 | source_cit_text_subs source_cit_text_sub
3469 source_cit_text_sub : continuation_sub
3473 source_cit_quay_sect : OPEN DELIM TAG_QUAY mand_line_item
3475 = start_element(ELT_SUB_SOUR_QUAY,
3477 GEDCOM_MAKE_STRING(val1, $4));
3478 START(QUAY, $1, $<ctxt>$)
3483 { end_element(ELT_SUB_SOUR_QUAY, PARENT, $<ctxt>5,
3484 GEDCOM_MAKE_NULL(val1));
3488 source_cit_emb_sect : OPEN DELIM TAG_SOUR mand_line_item
3489 { $<ctxt>$ = start_element(ELT_SUB_SOUR,
3491 GEDCOM_MAKE_STRING(val1, $4));
3492 reset_buffer(&concat_buffer);
3493 safe_buf_append(&concat_buffer, $4);
3494 START(SOUR, $1, $<ctxt>$)
3499 { char* complete = get_buf_string(&concat_buffer);
3500 end_element(ELT_SUB_SOUR, PARENT, $<ctxt>5,
3501 GEDCOM_MAKE_STRING(val1, complete));
3505 source_cit_emb_subs : /* empty */
3506 | source_cit_emb_subs source_cit_emb_sub
3509 source_cit_emb_sub : continuation_sub
3510 | source_cit_text_sect /* 0:M */
3515 /* SOURCE REPOSITORY CITATION */
3516 source_repos_cit_sub : source_repos_repo_sect { OCCUR2(REPO, 0, 1) }
3519 source_repos_repo_sect : OPEN DELIM TAG_REPO mand_pointer
3520 { struct xref_value *xr
3521 = gedcom_parse_xref($4, XREF_USED, XREF_REPO);
3522 if (xr == NULL) HANDLE_ERROR;
3524 = start_element(ELT_SUB_REPO,
3526 GEDCOM_MAKE_XREF_PTR(val1, xr));
3527 START(REPO, $1, $<ctxt>$)
3529 source_repos_repo_subs
3532 { end_element(ELT_SUB_REPO, PARENT, $<ctxt>5,
3533 GEDCOM_MAKE_NULL(val1));
3537 source_repos_repo_subs : /* empty */
3538 | source_repos_repo_subs source_repos_repo_sub
3541 source_repos_repo_sub : note_struc_sub
3542 | caln_sect /* 0:M */
3546 caln_sect : OPEN DELIM TAG_CALN mand_line_item
3547 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN,
3549 GEDCOM_MAKE_STRING(val1, $4));
3550 START(CALN, $1, $<ctxt>$)
3555 { end_element(ELT_SUB_REPO_CALN, PARENT, $<ctxt>5,
3556 GEDCOM_MAKE_NULL(val1));
3560 caln_subs : /* empty */
3561 | caln_subs caln_sub
3564 caln_sub : caln_medi_sect { OCCUR2(MEDI, 0, 1) }
3568 caln_medi_sect : OPEN DELIM TAG_MEDI mand_line_item
3569 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN_MEDI,
3571 GEDCOM_MAKE_STRING(val1, $4));
3572 START(MEDI, $1, $<ctxt>$)
3577 { end_element(ELT_SUB_REPO_CALN_MEDI, PARENT, $<ctxt>5,
3578 GEDCOM_MAKE_NULL(val1));
3582 /* SPOUSE TO FAMILY LINK */
3583 spou_fam_link_sub : spou_fam_fams_sect /* 0:M */
3586 spou_fam_fams_sect : OPEN DELIM TAG_FAMS mand_pointer
3587 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
3589 if (xr == NULL) HANDLE_ERROR;
3591 = start_element(ELT_SUB_FAMS,
3593 GEDCOM_MAKE_XREF_PTR(val1, xr));
3594 START(FAMS, $1, $<ctxt>$)
3599 { end_element(ELT_SUB_FAMS, PARENT, $<ctxt>5,
3600 GEDCOM_MAKE_NULL(val1));
3604 spou_fam_fams_subs : /* empty */
3605 | spou_fam_fams_subs spou_fam_fams_sub
3608 spou_fam_fams_sub : note_struc_sub
3612 /*********************************************************************/
3614 /*********************************************************************/
3616 no_std_subs : /* empty */
3617 | no_std_subs no_std_sub
3620 no_std_sub : user_sect /* 0:M */
3623 CLOSE { HANDLE_ERROR }
3626 no_std_rec : user_rec /* 0:M */
3629 CLOSE { HANDLE_ERROR }
3632 user_rec : OPEN DELIM opt_xref USERTAG
3633 { if ($4.string[0] != '_') {
3634 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3640 { struct xref_value *xr = NULL;
3642 xr = gedcom_parse_xref($3, XREF_DEFINED, XREF_USER);
3643 if (xr == NULL) HANDLE_ERROR;
3645 $<ctxt>$ = start_record(REC_USER,
3647 GEDCOM_MAKE_NULL_OR_XREF_PTR(val1, xr),
3649 START($4, $1, $<ctxt>$)
3654 { end_record(REC_USER, $<ctxt>7, GEDCOM_MAKE_NULL(val1)); }
3656 user_sect : OPEN DELIM opt_xref USERTAG
3657 { if ($4.string[0] != '_') {
3658 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3664 { $<ctxt>$ = start_element(ELT_USER, PARENT, $1, $4, $6, &val2);
3665 START($4, $1, $<ctxt>$);
3670 { end_element(ELT_USER, PARENT, $<ctxt>7,
3671 GEDCOM_MAKE_NULL(val1));
3675 user_sects : /* empty */ { }
3676 | user_sects user_sect { }
3679 opt_xref : /* empty */ { $$ = NULL; }
3680 | POINTER DELIM { $$ = $1; }
3683 opt_value : /* empty */ { GEDCOM_MAKE_NULL(val2);
3685 | DELIM POINTER { struct xref_value *xr
3686 = gedcom_parse_xref($2, XREF_USED,
3688 GEDCOM_MAKE_XREF_PTR(val2, xr);
3690 | DELIM line_item { GEDCOM_MAKE_STRING(val2, $2);
3694 mand_pointer : /* empty */ { gedcom_error(_("Missing pointer")); YYERROR; }
3695 | DELIM POINTER { gedcom_debug_print("==Ptr: %s==", $2);
3699 mand_line_item : /* empty */
3700 { if (compat_mode(C_NO_REQUIRED_VALUES)) {
3701 /* Lifelines tends to not care about mandatory values */
3702 gedcom_debug_print("==Val: ==");
3706 gedcom_error(_("Missing value")); YYERROR;
3709 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3713 opt_line_item : /* empty */ { $$ = NULL; }
3714 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3718 line_item : anychar { size_t i;
3719 reset_buffer(&line_item_buffer);
3720 /* The following also takes care of '@@' */
3721 if (!strncmp($1, "@@", 3))
3722 SAFE_BUF_ADDCHAR(&line_item_buffer, '@')
3724 for (i=0; i < strlen($1); i++)
3725 SAFE_BUF_ADDCHAR(&line_item_buffer, $1[i])
3726 $$ = get_buf_string(&line_item_buffer);
3728 | ESCAPE { size_t i;
3729 reset_buffer(&line_item_buffer);
3730 for (i=0; i < strlen($1); i++)
3731 SAFE_BUF_ADDCHAR(&line_item_buffer, $1[i])
3732 $$ = get_buf_string(&line_item_buffer);
3736 /* The following also takes care of '@@' */
3737 if (!strncmp($2, "@@", 3))
3738 SAFE_BUF_ADDCHAR(&line_item_buffer, '@')
3740 for (i=0; i < strlen($2); i++)
3741 SAFE_BUF_ADDCHAR(&line_item_buffer, $2[i])
3742 $$ = get_buf_string(&line_item_buffer);
3746 for (i=0; i < strlen($2); i++)
3747 SAFE_BUF_ADDCHAR(&line_item_buffer, $2[i])
3748 $$ = get_buf_string(&line_item_buffer);
3750 | line_item error anychar { HANDLE_ERROR; }
3751 | line_item error ESCAPE { HANDLE_ERROR; }
3754 anychar : ANYCHAR { }
3758 error_subs : /* empty */
3759 | error_subs error_sect
3762 error_sect : OPEN DELIM opt_xref anytag opt_value error_subs CLOSE { }
3765 gen_sect : OPEN DELIM opt_xref anystdtag
3766 { INVALID_TAG($4.string); }
3767 opt_value opt_sects CLOSE
3771 gen_rec : gen_rec_top
3775 gen_rec_norm : OPEN DELIM opt_xref anystdtag
3776 { INVALID_TOP_TAG($4.string) }
3777 opt_value opt_sects CLOSE
3781 gen_rec_top : OPEN DELIM anytoptag
3782 { gedcom_error(_("Missing cross-reference")); YYERROR; }
3783 opt_value opt_sects CLOSE
3787 opt_sects : /* empty */ { }
3788 | opt_sects gen_sect { }
3791 anytag : USERTAG { }
3805 anystdtag : TAG_ABBR
3936 /* Functions that handle the counting of subtags */
3938 int* count_arrays[MAXGEDCLEVEL+1];
3939 char tag_stack[MAXGEDCLEVEL+1][MAXSTDTAGLEN+1];
3940 Gedcom_ctxt ctxt_stack[MAXGEDCLEVEL+1];
3942 void push_countarray(int level)
3945 gedcom_debug_print("Push Count level: %d, level: %d\n", count_level, level);
3946 if (count_level != level + 1) {
3947 gedcom_error(_("Internal error: count level mismatch"));
3950 if (count_level > MAXGEDCLEVEL) {
3951 gedcom_error(_("Internal error: count array overflow"));
3955 gedcom_debug_print("calloc countarray %d\n", count_level);
3956 count = (int *)calloc(YYNTOKENS, sizeof(int));
3957 if (count == NULL) {
3958 gedcom_error(_("Internal error: count array calloc error"));
3962 count_arrays[count_level] = count;
3967 void set_parenttag(const char* tag)
3969 strncpy(tag_stack[count_level+1], tag, MAXSTDTAGLEN+1);
3972 void set_parentctxt(Gedcom_ctxt ctxt)
3974 ctxt_stack[count_level+1] = ctxt;
3977 char* get_parenttag(int offset)
3979 return tag_stack[count_level - offset];
3982 Gedcom_ctxt get_parentctxt(int offset)
3984 return ctxt_stack[count_level - offset];
3987 int count_tag(int tag)
3989 int *count = count_arrays[count_level];
3990 return ++count[tag - GEDCOMTAGOFFSET];
3993 int check_occurrence(int tag)
3995 int *count = count_arrays[count_level];
3996 return (count[tag - GEDCOMTAGOFFSET] > 0);
3999 void pop_countarray()
4002 gedcom_debug_print("Pop Count level: %d\n", count_level);
4003 if (count_level < 0) {
4004 gedcom_error(_("Internal error: count array underflow"));
4008 count = count_arrays[count_level];
4009 gedcom_debug_print("free countarray %d\n", count_level);
4011 count_arrays[count_level] = NULL;
4017 gedcom_debug_print("Cleanup countarrays\n");
4018 while (count_level > 0) {
4024 void cleanup_concat_buffer()
4026 cleanup_buffer(&concat_buffer);
4029 void cleanup_line_item_buffer()
4031 cleanup_buffer(&line_item_buffer);
4034 /* Enabling debug mode */
4035 /* level 0: no debugging */
4036 /* level 1: only internal */
4037 /* level 2: also bison */
4040 void gedcom_set_debug_level(int level, FILE* f)
4045 trace_output = stderr;
4047 gedcom_high_level_debug = 1;
4056 int gedcom_debug_print(const char* s, ...)
4059 if (gedcom_high_level_debug) {
4062 res = vfprintf(trace_output, s, ap);
4064 fprintf(trace_output, "\n");
4069 /* Setting the error mechanism */
4070 void gedcom_set_error_handling(Gedcom_err_mech mechanism)
4072 error_mechanism = mechanism;