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_FTREE)) {
448 CHECK3(SOUR, GEDC, CHAR);
449 compat_generate_submitter_link($<ctxt>4);
451 else if (compat_mode(C_LIFELINES)) {
453 compat_generate_submitter_link($<ctxt>4);
454 compat_generate_gedcom($<ctxt>4);
455 if (compat_generate_char($<ctxt>4)) HANDLE_ERROR;
458 CHECK4(SOUR, SUBM, GEDC, CHAR)
461 { end_record(REC_HEAD, $<ctxt>4, GEDCOM_MAKE_NULL(val1));
462 if (compat_mode(C_FTREE | C_LIFELINES))
463 compat_generate_submitter();
467 head_subs : /* empty */
471 head_sub : head_sour_sect { OCCUR2(SOUR, 1, 1) }
472 | head_dest_sect { OCCUR2(DEST, 0, 1) }
473 | head_date_sect { OCCUR2(DATE, 0, 1) }
474 | head_time_sect { if (!compat_mode(C_LIFELINES))
477 | head_subm_sect { OCCUR2(SUBM, 1, 1) }
478 | head_subn_sect { OCCUR2(SUBN, 0, 1) }
479 | head_file_sect { OCCUR2(FILE, 0, 1) }
480 | head_copr_sect { OCCUR2(COPR, 0, 1) }
481 | head_gedc_sect { OCCUR2(GEDC, 1, 1) }
482 | head_char_sect { OCCUR2(CHAR, 1, 1) }
483 | head_lang_sect { OCCUR2(LANG, 0, 1) }
484 | head_plac_sect { OCCUR2(PLAC, 0, 1) }
485 | head_note_sect { OCCUR2(NOTE, 0, 1) }
490 head_sour_sect : OPEN DELIM TAG_SOUR mand_line_item
491 { set_compatibility($4);
492 $<ctxt>$ = start_element(ELT_HEAD_SOUR, PARENT,
494 GEDCOM_MAKE_STRING(val1, $4));
495 START(SOUR, $1, $<ctxt>$)
500 { end_element(ELT_HEAD_SOUR, PARENT, $<ctxt>5,
501 GEDCOM_MAKE_NULL(val1)); }
504 head_sour_subs : /* empty */
505 | head_sour_subs head_sour_sub
508 head_sour_sub : head_sour_vers_sect { OCCUR2(VERS, 0, 1) }
509 | head_sour_name_sect { OCCUR2(NAME, 0, 1) }
510 | head_sour_corp_sect { OCCUR2(CORP, 0, 1) }
511 | head_sour_data_sect { OCCUR2(DATA, 0, 1) }
515 head_sour_vers_sect : OPEN DELIM TAG_VERS mand_line_item
516 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_VERS, PARENT,
518 GEDCOM_MAKE_STRING(val1, $4));
519 START(VERS, $1, $<ctxt>$)
524 { end_element(ELT_HEAD_SOUR_VERS,
525 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
528 head_sour_name_sect : OPEN DELIM TAG_NAME mand_line_item
529 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_NAME, PARENT,
531 GEDCOM_MAKE_STRING(val1, $4));
532 START(NAME, $1, $<ctxt>$)
537 { end_element(ELT_HEAD_SOUR_NAME,
538 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
541 head_sour_corp_sect : OPEN DELIM TAG_CORP mand_line_item
542 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_CORP, PARENT,
544 GEDCOM_MAKE_STRING(val1, $4));
545 START(CORP, $1, $<ctxt>$)
550 { end_element(ELT_HEAD_SOUR_CORP,
551 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
555 head_sour_corp_subs : /* empty */
556 | head_sour_corp_subs head_sour_corp_sub
559 head_sour_corp_sub : addr_struc_sub /* 0:1 */
563 head_sour_data_sect : OPEN DELIM TAG_DATA mand_line_item
564 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_DATA, PARENT,
566 GEDCOM_MAKE_STRING(val1, $4));
567 START(DATA, $1, $<ctxt>$)
572 { end_element(ELT_HEAD_SOUR_DATA,
573 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
577 head_sour_data_subs : /* empty */
578 | head_sour_data_subs head_sour_data_sub
581 head_sour_data_sub : head_sour_data_date_sect { OCCUR2(DATE, 0, 1) }
582 | head_sour_data_copr_sect { OCCUR2(COPR, 0, 1) }
586 head_sour_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
587 { struct date_value dv = gedcom_parse_date($4);
589 = start_element(ELT_HEAD_SOUR_DATA_DATE,
591 GEDCOM_MAKE_DATE(val1, dv));
592 START(DATE, $1, $<ctxt>$)
597 { end_element(ELT_HEAD_SOUR_DATA_DATE,
599 GEDCOM_MAKE_NULL(val1));
602 head_sour_data_copr_sect : OPEN DELIM TAG_COPR mand_line_item
604 = start_element(ELT_HEAD_SOUR_DATA_COPR,
606 GEDCOM_MAKE_STRING(val1, $4));
607 START(COPR, $1, $<ctxt>$)
612 { end_element(ELT_HEAD_SOUR_DATA_COPR,
614 GEDCOM_MAKE_NULL(val1));
619 head_dest_sect : OPEN DELIM TAG_DEST mand_line_item
620 { $<ctxt>$ = start_element(ELT_HEAD_DEST,
622 GEDCOM_MAKE_STRING(val1, $4));
623 START(DEST, $1, $<ctxt>$)
628 { end_element(ELT_HEAD_DEST,
629 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
634 head_date_sect : OPEN DELIM TAG_DATE mand_line_item
635 { struct date_value dv = gedcom_parse_date($4);
636 $<ctxt>$ = start_element(ELT_HEAD_DATE,
638 GEDCOM_MAKE_DATE(val1, dv));
639 START(DATE, $1, $<ctxt>$)
644 { end_element(ELT_HEAD_DATE,
645 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
649 head_date_subs : /* empty */
650 | head_date_subs head_date_sub
653 head_date_sub : head_date_time_sect { OCCUR2(TIME, 0, 1) }
657 head_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
658 { $<ctxt>$ = start_element(ELT_HEAD_DATE_TIME,
660 GEDCOM_MAKE_STRING(val1, $4));
661 START(TIME, $1, $<ctxt>$)
666 { end_element(ELT_HEAD_DATE_TIME,
667 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
671 /* HEAD.TIME (Only for 'Lifelines' compatibility) */
672 /* Just ignore the time... */
673 head_time_sect : OPEN DELIM TAG_TIME opt_line_item CLOSE
674 { gedcom_warning(_("Header change time lost in the compatibility"));
679 head_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
680 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
682 if (xr == NULL) HANDLE_ERROR;
683 $<ctxt>$ = start_element(ELT_HEAD_SUBM,
685 GEDCOM_MAKE_XREF_PTR(val1, xr));
686 START(SUBM, $1, $<ctxt>$)
691 { end_element(ELT_HEAD_SUBM,
692 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
696 head_subn_sect : OPEN DELIM TAG_SUBN mand_pointer
697 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
699 if (xr == NULL) HANDLE_ERROR;
700 $<ctxt>$ = start_element(ELT_HEAD_SUBN,
702 GEDCOM_MAKE_XREF_PTR(val1, xr));
703 START(SUBN, $1, $<ctxt>$)
708 { end_element(ELT_HEAD_SUBN,
709 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
713 head_file_sect : OPEN DELIM TAG_FILE mand_line_item
714 { $<ctxt>$ = start_element(ELT_HEAD_FILE,
716 GEDCOM_MAKE_STRING(val1, $4));
717 START(FILE, $1, $<ctxt>$)
722 { end_element(ELT_HEAD_FILE, PARENT, $<ctxt>5,
723 GEDCOM_MAKE_NULL(val1));
727 head_copr_sect : OPEN DELIM TAG_COPR mand_line_item
728 { $<ctxt>$ = start_element(ELT_HEAD_COPR,
730 GEDCOM_MAKE_STRING(val1, $4));
731 START(COPR, $1, $<ctxt>$)
736 { end_element(ELT_HEAD_COPR, PARENT, $<ctxt>5,
737 GEDCOM_MAKE_NULL(val1));
741 head_gedc_sect : OPEN DELIM TAG_GEDC
742 { $<ctxt>$ = start_element(ELT_HEAD_GEDC,
743 PARENT, $1, $3, NULL,
744 GEDCOM_MAKE_NULL(val1));
745 START(GEDC, $1, $<ctxt>$)
748 { CHECK2(VERS, FORM) }
750 { end_element(ELT_HEAD_GEDC, PARENT, $<ctxt>4,
751 GEDCOM_MAKE_NULL(val1));
755 head_gedc_subs : /* empty */
756 | head_gedc_subs head_gedc_sub
759 head_gedc_sub : head_gedc_vers_sect { OCCUR2(VERS, 1, 1) }
760 | head_gedc_form_sect { OCCUR2(FORM, 1, 1) }
763 head_gedc_vers_sect : OPEN DELIM TAG_VERS mand_line_item
764 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_VERS,
766 GEDCOM_MAKE_STRING(val1, $4));
767 START(VERS, $1, $<ctxt>$)
772 { end_element(ELT_HEAD_GEDC_VERS,
773 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
776 head_gedc_form_sect : OPEN DELIM TAG_FORM mand_line_item
777 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_FORM,
779 GEDCOM_MAKE_STRING(val1, $4));
780 START(FORM, $1, $<ctxt>$)
785 { end_element(ELT_HEAD_GEDC_FORM,
786 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
791 head_char_sect : OPEN DELIM TAG_CHAR mand_line_item
792 { /* Don't allow to continue if conversion context couldn't
794 if (open_conv_to_internal($4) == 0) HANDLE_ERROR;
795 $<ctxt>$ = start_element(ELT_HEAD_CHAR,
797 GEDCOM_MAKE_STRING(val1, $4));
798 START(CHAR, $1, $<ctxt>$)
803 { end_element(ELT_HEAD_CHAR, PARENT, $<ctxt>5,
804 GEDCOM_MAKE_NULL(val1));
808 head_char_subs : /* empty */
809 | head_char_subs head_char_sub
812 head_char_sub : head_char_vers_sect { OCCUR2(VERS, 0, 1) }
815 head_char_vers_sect : OPEN DELIM TAG_VERS mand_line_item
816 { $<ctxt>$ = start_element(ELT_HEAD_CHAR_VERS,
818 GEDCOM_MAKE_STRING(val1, $4));
819 START(VERS, $1, $<ctxt>$)
824 { end_element(ELT_HEAD_CHAR_VERS,
825 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
830 head_lang_sect : OPEN DELIM TAG_LANG mand_line_item
831 { $<ctxt>$ = start_element(ELT_HEAD_LANG,
833 GEDCOM_MAKE_STRING(val1, $4));
834 START(LANG, $1, $<ctxt>$)
839 { end_element(ELT_HEAD_LANG, PARENT, $<ctxt>5,
840 GEDCOM_MAKE_NULL(val1));
844 head_plac_sect : OPEN DELIM TAG_PLAC
845 { $<ctxt>$ = start_element(ELT_HEAD_PLAC,
846 PARENT, $1, $3, NULL,
847 GEDCOM_MAKE_NULL(val1));
848 START(PLAC, $1, $<ctxt>$)
853 { end_element(ELT_HEAD_PLAC, PARENT, $<ctxt>4,
854 GEDCOM_MAKE_NULL(val1));
858 head_plac_subs : /* empty */
859 | head_plac_subs head_plac_sub
862 head_plac_sub : head_plac_form_sect { OCCUR2(FORM, 1, 1) }
865 head_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
866 { $<ctxt>$ = start_element(ELT_HEAD_PLAC_FORM,
868 GEDCOM_MAKE_STRING(val1, $4));
869 START(FORM, $1, $<ctxt>$)
874 { end_element(ELT_HEAD_PLAC_FORM,
875 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
880 head_note_sect : OPEN DELIM TAG_NOTE mand_line_item
881 { $<ctxt>$ = start_element(ELT_HEAD_NOTE,
883 GEDCOM_MAKE_STRING(val1, $4));
884 reset_buffer(&concat_buffer);
885 safe_buf_append(&concat_buffer, $4);
886 START(NOTE, $1, $<ctxt>$)
891 { char* complete = get_buf_string(&concat_buffer);
892 end_element(ELT_HEAD_NOTE, PARENT, $<ctxt>5,
893 GEDCOM_MAKE_STRING(val1, complete));
897 head_note_subs : /* empty */
898 | head_note_subs head_note_sub
901 head_note_sub : continuation_sub /* 0:M */
905 /*********************************************************************/
907 /*********************************************************************/
908 /* Don't need callbacks here, there is no information... */
909 trlr_sect : OPEN DELIM TAG_TRLR CLOSE { }
912 /*********************************************************************/
913 /**** Family record ****/
914 /*********************************************************************/
915 fam_rec : OPEN DELIM POINTER DELIM TAG_FAM
916 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
918 if (xr == NULL) HANDLE_ERROR;
919 $<ctxt>$ = start_record(REC_FAM,
920 $1, GEDCOM_MAKE_XREF_PTR(val1, xr),
922 NULL, GEDCOM_MAKE_NULL(val2));
923 START(FAM, $1, $<ctxt>$) }
927 { end_record(REC_FAM, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
930 fam_subs : /* empty */
934 fam_sub : fam_event_struc_sub /* 0:M */
935 | fam_husb_sect { OCCUR2(HUSB, 0, 1) }
936 | fam_wife_sect { OCCUR2(WIFE, 0, 1) }
937 | fam_chil_sect /* 0:M */
938 | fam_nchi_sect { OCCUR2(NCHI, 0, 1) }
939 | fam_subm_sect /* 0:M */
940 | lds_spouse_seal_sub /* 0:M */
941 | source_cit_sub /* 0:M */
942 | multim_link_sub /* 0:M */
943 | note_struc_sub /* 0:M */
944 | ident_struc_sub /* 0:1 */
945 | change_date_sub /* 0:1 */
950 fam_husb_sect : OPEN DELIM TAG_HUSB mand_pointer
951 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
953 if (xr == NULL) HANDLE_ERROR;
954 $<ctxt>$ = start_element(ELT_FAM_HUSB,
956 GEDCOM_MAKE_XREF_PTR(val1, xr));
957 START(HUSB, $1, $<ctxt>$)
962 { end_element(ELT_FAM_HUSB, PARENT, $<ctxt>5,
963 GEDCOM_MAKE_NULL(val1));
968 fam_wife_sect : OPEN DELIM TAG_WIFE mand_pointer
969 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
971 if (xr == NULL) HANDLE_ERROR;
972 $<ctxt>$ = start_element(ELT_FAM_WIFE,
974 GEDCOM_MAKE_XREF_PTR(val1, xr));
975 START(WIFE, $1, $<ctxt>$)
980 { end_element(ELT_FAM_WIFE, PARENT, $<ctxt>5,
981 GEDCOM_MAKE_NULL(val1));
986 fam_chil_sect : OPEN DELIM TAG_CHIL mand_pointer
987 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
989 if (xr == NULL) HANDLE_ERROR;
990 $<ctxt>$ = start_element(ELT_FAM_CHIL,
992 GEDCOM_MAKE_XREF_PTR(val1, xr));
993 START(CHIL, $1, $<ctxt>$)
998 { end_element(ELT_FAM_CHIL, PARENT, $<ctxt>5,
999 GEDCOM_MAKE_NULL(val1));
1004 fam_nchi_sect : OPEN DELIM TAG_NCHI mand_line_item
1005 { $<ctxt>$ = start_element(ELT_FAM_NCHI,
1007 GEDCOM_MAKE_STRING(val1, $4));
1008 START(NCHI, $1, $<ctxt>$)
1013 { end_element(ELT_FAM_NCHI, PARENT, $<ctxt>5,
1014 GEDCOM_MAKE_NULL(val1));
1019 fam_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1020 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1022 if (xr == NULL) HANDLE_ERROR;
1023 $<ctxt>$ = start_element(ELT_FAM_SUBM,
1025 GEDCOM_MAKE_XREF_PTR(val1, xr));
1026 START(SUBM, $1, $<ctxt>$)
1031 { end_element(ELT_FAM_SUBM, PARENT, $<ctxt>5,
1032 GEDCOM_MAKE_NULL(val1));
1036 /*********************************************************************/
1037 /**** Individual record ****/
1038 /*********************************************************************/
1039 indiv_rec : OPEN DELIM POINTER DELIM TAG_INDI
1040 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1042 if (xr == NULL) HANDLE_ERROR;
1043 $<ctxt>$ = start_record(REC_INDI,
1044 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1045 NULL, GEDCOM_MAKE_NULL(val2));
1046 START(INDI, $1, $<ctxt>$) }
1050 { end_record(REC_INDI, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1053 indi_subs : /* empty */
1054 | indi_subs indi_sub
1057 indi_sub : indi_resn_sect { OCCUR2(RESN, 0, 1) }
1058 | pers_name_struc_sub /* 0:M */
1059 | indi_sex_sect { OCCUR2(SEX, 0, 1) }
1060 | indiv_even_struc_sub /* 0:M */
1061 | indiv_attr_struc_sub /* 0:M */
1062 | lds_indiv_ord_sub /* 0:M */
1063 | chi_fam_link_sub /* 0:M */
1064 | spou_fam_link_sub /* 0:M */
1065 | indi_subm_sect /* 0:M */
1066 | assoc_struc_sub /* 0:M */
1067 | indi_alia_sect /* 0:M */
1068 | indi_anci_sect /* 0:M */
1069 | indi_desi_sect /* 0:M */
1070 | source_cit_sub /* 0:M */
1071 | multim_link_sub /* 0:M */
1072 | note_struc_sub /* 0:M */
1073 | indi_rfn_sect { OCCUR2(RFN, 0, 1) }
1074 | indi_afn_sect /* 0:M */
1075 | ident_struc_sub /* 0:1 */
1076 | change_date_sub /* 0:1 */
1077 | ftree_addr_sect { if (!compat_mode(C_FTREE))
1078 INVALID_TAG("ADDR");
1084 indi_resn_sect : OPEN DELIM TAG_RESN mand_line_item
1085 { $<ctxt>$ = start_element(ELT_INDI_RESN,
1087 GEDCOM_MAKE_STRING(val1, $4));
1088 START(RESN, $1, $<ctxt>$)
1093 { end_element(ELT_INDI_RESN, PARENT, $<ctxt>5,
1094 GEDCOM_MAKE_NULL(val1));
1099 indi_sex_sect : OPEN DELIM TAG_SEX mand_line_item
1100 { $<ctxt>$ = start_element(ELT_INDI_SEX,
1102 GEDCOM_MAKE_STRING(val1, $4));
1103 START(SEX, $1, $<ctxt>$)
1108 { end_element(ELT_INDI_SEX, PARENT, $<ctxt>5,
1109 GEDCOM_MAKE_NULL(val1));
1114 indi_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1115 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1117 if (xr == NULL) HANDLE_ERROR;
1118 $<ctxt>$ = start_element(ELT_INDI_SUBM,
1120 GEDCOM_MAKE_XREF_PTR(val1, xr));
1121 START(SUBM, $1, $<ctxt>$)
1126 { end_element(ELT_INDI_SUBM, PARENT, $<ctxt>5,
1127 GEDCOM_MAKE_NULL(val1));
1132 indi_alia_sect : OPEN DELIM TAG_ALIA mand_pointer
1133 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1135 if (xr == NULL) HANDLE_ERROR;
1136 $<ctxt>$ = start_element(ELT_INDI_ALIA,
1138 GEDCOM_MAKE_XREF_PTR(val1, xr));
1139 START(ALIA, $1, $<ctxt>$)
1144 { end_element(ELT_INDI_ALIA, PARENT, $<ctxt>5,
1145 GEDCOM_MAKE_NULL(val1));
1150 indi_anci_sect : OPEN DELIM TAG_ANCI mand_pointer
1151 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1153 if (xr == NULL) HANDLE_ERROR;
1154 $<ctxt>$ = start_element(ELT_INDI_ANCI,
1156 GEDCOM_MAKE_XREF_PTR(val1, xr));
1157 START(ANCI, $1, $<ctxt>$)
1162 { end_element(ELT_INDI_ANCI, PARENT, $<ctxt>5,
1163 GEDCOM_MAKE_NULL(val1));
1168 indi_desi_sect : OPEN DELIM TAG_DESI mand_pointer
1169 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1171 if (xr == NULL) HANDLE_ERROR;
1172 $<ctxt>$ = start_element(ELT_INDI_DESI,
1174 GEDCOM_MAKE_XREF_PTR(val1, xr));
1175 START(DESI, $1, $<ctxt>$)
1180 { end_element(ELT_INDI_DESI, PARENT, $<ctxt>5,
1181 GEDCOM_MAKE_NULL(val1));
1186 indi_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1187 { $<ctxt>$ = start_element(ELT_INDI_RFN,
1189 GEDCOM_MAKE_STRING(val1, $4));
1190 START(RFN, $1, $<ctxt>$)
1195 { end_element(ELT_INDI_RFN, PARENT, $<ctxt>5,
1196 GEDCOM_MAKE_NULL(val1));
1201 indi_afn_sect : OPEN DELIM TAG_AFN mand_line_item
1202 { $<ctxt>$ = start_element(ELT_INDI_AFN,
1204 GEDCOM_MAKE_STRING(val1, $4));
1205 START(AFN, $1, $<ctxt>$)
1210 { end_element(ELT_INDI_AFN, PARENT, $<ctxt>5,
1211 GEDCOM_MAKE_NULL(val1));
1215 /* INDI.ADDR (Only for 'ftree' compatibility) */
1216 ftree_addr_sect : OPEN DELIM TAG_ADDR opt_line_item
1217 { if (compat_mode(C_FTREE)) {
1218 Gedcom_ctxt par = compat_generate_resi_start(PARENT);
1219 START(RESI, $1, par);
1221 = start_element(ELT_SUB_ADDR,
1222 par, $1 + 1, $3, $4,
1223 GEDCOM_MAKE_NULL_OR_STRING(val2, $4));
1224 START(ADDR, $1, $<ctxt>$);
1226 else { START(ADDR, $1, NULL) }
1231 { if (compat_mode(C_FTREE)) {
1232 Gedcom_ctxt par = PARENT;
1233 end_element(ELT_SUB_ADDR, par, $<ctxt>5,
1234 GEDCOM_MAKE_NULL(val1));
1236 compat_generate_resi_end(PARENT, par);
1241 ftree_addr_subs : /* empty */
1242 | ftree_addr_subs ftree_addr_sub
1245 ftree_addr_sub : continuation_sub
1246 | ftree_addr_phon_sect
1250 ftree_addr_phon_sect : OPEN DELIM TAG_PHON mand_line_item
1252 = start_element(ELT_SUB_PHON,
1253 GRANDPARENT(1), $1, $3, $4,
1254 GEDCOM_MAKE_STRING(val1, $4));
1255 START(PHON, $1, $<ctxt>$)
1260 { end_element(ELT_SUB_PHON, GRANDPARENT(1),
1261 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1265 /*********************************************************************/
1266 /**** Multimedia record ****/
1267 /*********************************************************************/
1268 multim_rec : OPEN DELIM POINTER DELIM TAG_OBJE
1269 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1271 if (xr == NULL) HANDLE_ERROR;
1272 $<ctxt>$ = start_record(REC_OBJE,
1273 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1274 NULL, GEDCOM_MAKE_NULL(val2));
1275 START(OBJE, $1, $<ctxt>$) }
1277 { CHECK2(FORM, BLOB) }
1279 { end_record(REC_OBJE, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1282 obje_subs : /* empty */
1283 | obje_subs obje_sub
1286 obje_sub : obje_form_sect { OCCUR2(FORM, 1, 1) }
1287 | obje_titl_sect { OCCUR2(TITL, 0, 1) }
1288 | note_struc_sub /* 0:M */
1289 | obje_blob_sect { OCCUR2(BLOB, 1, 1) }
1290 | obje_obje_sect { OCCUR2(OBJE, 0, 1) }
1291 | ident_struc_sub /* 0:1 */
1292 | change_date_sub /* 0:1 */
1297 obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
1298 { $<ctxt>$ = start_element(ELT_OBJE_FORM,
1300 GEDCOM_MAKE_STRING(val1, $4));
1301 START(FORM, $1, $<ctxt>$)
1306 { end_element(ELT_OBJE_FORM, PARENT, $<ctxt>5,
1307 GEDCOM_MAKE_NULL(val1));
1312 obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1313 { $<ctxt>$ = start_element(ELT_OBJE_TITL,
1315 GEDCOM_MAKE_STRING(val1, $4));
1316 START(TITL, $1, $<ctxt>$)
1321 { end_element(ELT_OBJE_TITL, PARENT, $<ctxt>5,
1322 GEDCOM_MAKE_NULL(val1));
1327 obje_blob_sect : OPEN DELIM TAG_BLOB
1328 { $<ctxt>$ = start_element(ELT_OBJE_BLOB,
1329 PARENT, $1, $3, NULL,
1330 GEDCOM_MAKE_NULL(val1));
1331 reset_buffer(&concat_buffer);
1332 START(BLOB, $1, $<ctxt>$)
1337 { char* complete = get_buf_string(&concat_buffer);
1338 end_element(ELT_OBJE_BLOB, PARENT, $<ctxt>4,
1339 GEDCOM_MAKE_STRING(val1, complete));
1343 obje_blob_subs : /* empty */
1344 | obje_blob_subs obje_blob_sub
1347 obje_blob_sub : obje_blob_cont_sect { OCCUR1(CONT, 1) }
1351 obje_blob_cont_sect : OPEN DELIM TAG_CONT mand_line_item
1352 { $<ctxt>$ = start_element(ELT_OBJE_BLOB_CONT,
1354 GEDCOM_MAKE_STRING(val1, $4));
1355 safe_buf_append(&concat_buffer, $4);
1356 START(CONT, $1, $<ctxt>$)
1361 { end_element(ELT_OBJE_BLOB_CONT, PARENT,
1362 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1367 obje_obje_sect : OPEN DELIM TAG_OBJE mand_pointer
1368 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1370 if (xr == NULL) HANDLE_ERROR;
1371 $<ctxt>$ = start_element(ELT_OBJE_OBJE,
1373 GEDCOM_MAKE_XREF_PTR(val1, xr));
1374 START(OBJE, $1, $<ctxt>$)
1379 { end_element(ELT_OBJE_OBJE, PARENT, $<ctxt>5,
1380 GEDCOM_MAKE_NULL(val1));
1384 /*********************************************************************/
1385 /**** Note record ****/
1386 /*********************************************************************/
1387 note_rec : OPEN DELIM POINTER DELIM TAG_NOTE note_line_item
1388 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1390 if (xr == NULL) HANDLE_ERROR;
1391 $<ctxt>$ = start_record(REC_NOTE,
1392 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1393 $6, GEDCOM_MAKE_STRING(val2, $6));
1394 reset_buffer(&concat_buffer);
1395 safe_buf_append(&concat_buffer, $6);
1396 START(NOTE, $1, $<ctxt>$) }
1400 { char* complete = get_buf_string(&concat_buffer);
1401 end_record(REC_NOTE, $<ctxt>7,
1402 GEDCOM_MAKE_STRING(val1, complete)); }
1405 note_line_item : /* empty */
1406 { if (!compat_mode(C_FTREE)) {
1407 gedcom_error(_("Missing value")); YYERROR;
1414 { gedcom_debug_print("==Val: %s==", $2);
1418 note_subs : /* empty */
1419 | note_subs note_sub
1422 note_sub : continuation_sub /* 0:M */
1423 | source_cit_sub /* 0:M */
1424 | ident_struc_sub /* 0:1 */
1425 | change_date_sub /* 0:1 */
1429 /*********************************************************************/
1430 /**** Repository record ****/
1431 /*********************************************************************/
1432 repos_rec : OPEN DELIM POINTER DELIM TAG_REPO
1433 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1435 if (xr == NULL) HANDLE_ERROR;
1436 $<ctxt>$ = start_record(REC_REPO,
1437 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1438 NULL, GEDCOM_MAKE_NULL(val2));
1439 START(REPO, $1, $<ctxt>$) }
1443 { end_record(REC_REPO, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1446 repo_subs : /* empty */
1447 | repo_subs repo_sub
1450 repo_sub : repo_name_sect { OCCUR2(NAME, 0, 1) }
1451 | addr_struc_sub /* 0:1 */
1452 | note_struc_sub /* 0:M */
1453 | ident_struc_sub /* 0:1 */
1454 | change_date_sub /* 0:1 */
1459 repo_name_sect : OPEN DELIM TAG_NAME mand_line_item
1460 { $<ctxt>$ = start_element(ELT_REPO_NAME,
1462 GEDCOM_MAKE_STRING(val1, $4));
1463 START(NAME, $1, $<ctxt>$)
1468 { end_element(ELT_REPO_NAME, PARENT, $<ctxt>5,
1469 GEDCOM_MAKE_NULL(val1));
1473 /*********************************************************************/
1474 /**** Source record ****/
1475 /*********************************************************************/
1476 source_rec : OPEN DELIM POINTER DELIM TAG_SOUR
1477 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1479 if (xr == NULL) HANDLE_ERROR;
1480 $<ctxt>$ = start_record(REC_SOUR,
1481 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1482 NULL, GEDCOM_MAKE_NULL(val2));
1483 START(SOUR, $1, $<ctxt>$) }
1487 { end_record(REC_SOUR, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1490 sour_subs : /* empty */
1491 | sour_subs sour_sub
1494 sour_sub : sour_data_sect { OCCUR2(DATA, 0, 1) }
1495 | sour_auth_sect { OCCUR2(AUTH, 0, 1) }
1496 | sour_titl_sect { OCCUR2(TITL, 0, 1) }
1497 | sour_abbr_sect { OCCUR2(ABBR, 0, 1) }
1498 | sour_publ_sect { OCCUR2(PUBL, 0, 1) }
1499 | sour_text_sect { OCCUR2(TEXT, 0, 1) }
1500 | source_repos_cit_sub /* 0:1 */
1501 | multim_link_sub /* 0:M */
1502 | note_struc_sub /* 0:M */
1503 | ident_struc_sub /* 0:1 */
1504 | change_date_sub /* 0:1 */
1509 sour_data_sect : OPEN DELIM TAG_DATA
1510 { $<ctxt>$ = start_element(ELT_SOUR_DATA,
1511 PARENT, $1, $3, NULL,
1512 GEDCOM_MAKE_NULL(val1));
1513 START(DATA, $1, $<ctxt>$)
1518 { end_element(ELT_SOUR_DATA, PARENT, $<ctxt>4,
1519 GEDCOM_MAKE_NULL(val1));
1523 sour_data_subs : /* empty */
1524 | sour_data_subs sour_data_sub
1527 sour_data_sub : sour_data_even_sect /* 0:M */
1528 | sour_data_agnc_sect { OCCUR2(AGNC, 0, 1) }
1529 | note_struc_sub /* 0:M */
1533 sour_data_even_sect : OPEN DELIM TAG_EVEN mand_line_item
1534 { $<ctxt>$ = start_element(ELT_SOUR_DATA_EVEN,
1536 GEDCOM_MAKE_STRING(val1, $4));
1537 START(EVEN, $1, $<ctxt>$)
1542 { end_element(ELT_SOUR_DATA_EVEN, PARENT,
1543 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1547 sour_data_even_subs : /* empty */
1548 | sour_data_even_subs sour_data_even_sub
1551 sour_data_even_sub : sour_data_even_date_sect { OCCUR2(DATE, 0, 1) }
1552 | sour_data_even_plac_sect { OCCUR2(PLAC, 0, 1) }
1556 sour_data_even_date_sect : OPEN DELIM TAG_DATE mand_line_item
1557 { struct date_value dv = gedcom_parse_date($4);
1559 = start_element(ELT_SOUR_DATA_EVEN_DATE,
1561 GEDCOM_MAKE_DATE(val1, dv));
1562 START(DATE, $1, $<ctxt>$)
1567 { end_element(ELT_SOUR_DATA_EVEN_DATE, PARENT,
1568 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1572 sour_data_even_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
1574 = start_element(ELT_SOUR_DATA_EVEN_PLAC,
1576 GEDCOM_MAKE_STRING(val1, $4));
1577 START(PLAC, $1, $<ctxt>$)
1582 { end_element(ELT_SOUR_DATA_EVEN_PLAC, PARENT,
1583 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1587 sour_data_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
1588 { $<ctxt>$ = start_element(ELT_SOUR_DATA_AGNC,
1590 GEDCOM_MAKE_STRING(val1, $4));
1591 START(AGNC, $1, $<ctxt>$)
1596 { end_element(ELT_SOUR_DATA_AGNC, PARENT,
1597 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1602 sour_auth_sect : OPEN DELIM TAG_AUTH mand_line_item
1603 { $<ctxt>$ = start_element(ELT_SOUR_AUTH,
1605 GEDCOM_MAKE_STRING(val1, $4));
1606 reset_buffer(&concat_buffer);
1607 safe_buf_append(&concat_buffer, $4);
1608 START(AUTH, $1, $<ctxt>$)
1613 { char* complete = get_buf_string(&concat_buffer);
1614 end_element(ELT_SOUR_AUTH, PARENT, $<ctxt>5,
1615 GEDCOM_MAKE_STRING(val1, complete));
1619 sour_auth_subs : /* empty */
1620 | sour_auth_subs sour_auth_sub
1623 sour_auth_sub : continuation_sub /* 0:M */
1628 sour_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1629 { $<ctxt>$ = start_element(ELT_SOUR_TITL,
1631 GEDCOM_MAKE_STRING(val1, $4));
1632 reset_buffer(&concat_buffer);
1633 safe_buf_append(&concat_buffer, $4);
1634 START(TITL, $1, $<ctxt>$)
1639 { char* complete = get_buf_string(&concat_buffer);
1640 end_element(ELT_SOUR_TITL, PARENT, $<ctxt>5,
1641 GEDCOM_MAKE_STRING(val1, complete));
1645 sour_titl_subs : /* empty */
1646 | sour_titl_subs sour_titl_sub
1649 sour_titl_sub : continuation_sub /* 0:M */
1654 sour_abbr_sect : OPEN DELIM TAG_ABBR mand_line_item
1655 { $<ctxt>$ = start_element(ELT_SOUR_ABBR,
1657 GEDCOM_MAKE_STRING(val1, $4));
1658 START(ABBR, $1, $<ctxt>$)
1663 { end_element(ELT_SOUR_ABBR, PARENT, $<ctxt>5,
1664 GEDCOM_MAKE_NULL(val1));
1669 sour_publ_sect : OPEN DELIM TAG_PUBL mand_line_item
1670 { $<ctxt>$ = start_element(ELT_SOUR_PUBL,
1672 GEDCOM_MAKE_STRING(val1, $4));
1673 reset_buffer(&concat_buffer);
1674 safe_buf_append(&concat_buffer, $4);
1675 START(PUBL, $1, $<ctxt>$)
1680 { char* complete = get_buf_string(&concat_buffer);
1681 end_element(ELT_SOUR_PUBL, PARENT, $<ctxt>5,
1682 GEDCOM_MAKE_STRING(val1, complete));
1686 sour_publ_subs : /* empty */
1687 | sour_publ_subs sour_publ_sub
1690 sour_publ_sub : continuation_sub /* 0:M */
1695 sour_text_sect : OPEN DELIM TAG_TEXT mand_line_item
1696 { $<ctxt>$ = start_element(ELT_SOUR_TEXT,
1698 GEDCOM_MAKE_STRING(val1, $4));
1699 reset_buffer(&concat_buffer);
1700 safe_buf_append(&concat_buffer, $4);
1701 START(TEXT, $1, $<ctxt>$)
1706 { char* complete = get_buf_string(&concat_buffer);
1707 end_element(ELT_SOUR_TEXT, PARENT, $<ctxt>5,
1708 GEDCOM_MAKE_STRING(val1, complete));
1712 sour_text_subs : /* empty */
1713 | sour_text_subs sour_text_sub
1716 sour_text_sub : continuation_sub /* 0:M */
1720 /*********************************************************************/
1721 /**** Submission record ****/
1722 /*********************************************************************/
1723 submis_rec : OPEN DELIM POINTER DELIM TAG_SUBN
1724 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1726 if (xr == NULL) HANDLE_ERROR;
1727 $<ctxt>$ = start_record(REC_SUBN,
1728 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1729 NULL, GEDCOM_MAKE_NULL(val2));
1730 START(SUBN, $1, $<ctxt>$) }
1734 { end_record(REC_SUBN, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1737 subn_subs : /* empty */
1738 | subn_subs subn_sub
1741 subn_sub : subn_subm_sect { OCCUR2(SUBM, 0, 1) }
1742 | subn_famf_sect { OCCUR2(FAMF, 0, 1) }
1743 | subn_temp_sect { OCCUR2(TEMP, 0, 1) }
1744 | subn_ance_sect { OCCUR2(ANCE, 0, 1) }
1745 | subn_desc_sect { OCCUR2(DESC, 0, 1) }
1746 | subn_ordi_sect { OCCUR2(ORDI, 0, 1) }
1747 | subn_rin_sect { OCCUR2(RIN, 0, 1) }
1752 subn_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1753 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1755 if (xr == NULL) HANDLE_ERROR;
1756 $<ctxt>$ = start_element(ELT_SUBN_SUBM,
1758 GEDCOM_MAKE_XREF_PTR(val1, xr));
1759 START(SUBM, $1, $<ctxt>$)
1764 { end_element(ELT_SUBN_SUBM, PARENT, $<ctxt>5,
1765 GEDCOM_MAKE_NULL(val1));
1770 subn_famf_sect : OPEN DELIM TAG_FAMF mand_line_item
1771 { $<ctxt>$ = start_element(ELT_SUBN_FAMF,
1773 GEDCOM_MAKE_STRING(val1, $4));
1774 START(FAMF, $1, $<ctxt>$)
1779 { end_element(ELT_SUBN_FAMF, PARENT, $<ctxt>5,
1780 GEDCOM_MAKE_NULL(val1));
1785 subn_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
1786 { $<ctxt>$ = start_element(ELT_SUBN_TEMP,
1788 GEDCOM_MAKE_STRING(val1, $4));
1789 START(TEMP, $1, $<ctxt>$)
1794 { end_element(ELT_SUBN_TEMP, PARENT, $<ctxt>5,
1795 GEDCOM_MAKE_NULL(val1));
1800 subn_ance_sect : OPEN DELIM TAG_ANCE mand_line_item
1801 { $<ctxt>$ = start_element(ELT_SUBN_ANCE,
1803 GEDCOM_MAKE_STRING(val1, $4));
1804 START(ANCE, $1, $<ctxt>$)
1809 { end_element(ELT_SUBN_ANCE, PARENT, $<ctxt>5,
1810 GEDCOM_MAKE_NULL(val1));
1815 subn_desc_sect : OPEN DELIM TAG_DESC mand_line_item
1816 { $<ctxt>$ = start_element(ELT_SUBN_DESC,
1818 GEDCOM_MAKE_STRING(val1, $4));
1819 START(DESC, $1, $<ctxt>$)
1824 { end_element(ELT_SUBN_DESC, PARENT, $<ctxt>5,
1825 GEDCOM_MAKE_NULL(val1));
1830 subn_ordi_sect : OPEN DELIM TAG_ORDI mand_line_item
1831 { $<ctxt>$ = start_element(ELT_SUBN_ORDI,
1833 GEDCOM_MAKE_STRING(val1, $4));
1834 START(ORDI, $1, $<ctxt>$)
1839 { end_element(ELT_SUBN_ORDI, PARENT, $<ctxt>5,
1840 GEDCOM_MAKE_NULL(val1));
1845 subn_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1846 { $<ctxt>$ = start_element(ELT_SUBN_RIN,
1848 GEDCOM_MAKE_STRING(val1, $4));
1849 START(RIN, $1, $<ctxt>$)
1854 { end_element(ELT_SUBN_RIN, PARENT, $<ctxt>5,
1855 GEDCOM_MAKE_NULL(val1));
1859 /*********************************************************************/
1860 /**** Submitter record ****/
1861 /*********************************************************************/
1862 submit_rec : OPEN DELIM POINTER DELIM TAG_SUBM
1863 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1865 if (xr == NULL) HANDLE_ERROR;
1866 $<ctxt>$ = start_record(REC_SUBM,
1867 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1868 NULL, GEDCOM_MAKE_NULL(val2));
1869 START(SUBM, $1, $<ctxt>$) }
1873 { end_record(REC_SUBM, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1876 subm_subs : /* empty */
1877 | subm_subs subm_sub
1880 subm_sub : subm_name_sect { OCCUR2(NAME, 1, 1) }
1881 | addr_struc_sub /* 0:1 */
1882 | multim_link_sub /* 0:M */
1883 | subm_lang_sect { OCCUR2(LANG, 0, 3) }
1884 | subm_rfn_sect { OCCUR2(RFN, 0, 1) }
1885 | subm_rin_sect { OCCUR2(RIN, 0, 1) }
1886 | change_date_sub /* 0:1 */
1891 subm_name_sect : OPEN DELIM TAG_NAME mand_line_item
1892 { $<ctxt>$ = start_element(ELT_SUBM_NAME,
1894 GEDCOM_MAKE_STRING(val1, $4));
1895 START(NAME, $1, $<ctxt>$)
1900 { end_element(ELT_SUBM_NAME, PARENT, $<ctxt>5,
1901 GEDCOM_MAKE_NULL(val1));
1906 subm_lang_sect : OPEN DELIM TAG_LANG mand_line_item
1907 { $<ctxt>$ = start_element(ELT_SUBM_LANG,
1909 GEDCOM_MAKE_STRING(val1, $4));
1910 START(LANG, $1, $<ctxt>$)
1915 { end_element(ELT_SUBM_LANG, PARENT, $<ctxt>5,
1916 GEDCOM_MAKE_NULL(val1));
1921 subm_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1922 { $<ctxt>$ = start_element(ELT_SUBM_RFN,
1924 GEDCOM_MAKE_STRING(val1, $4));
1925 START(RFN, $1, $<ctxt>$)
1930 { end_element(ELT_SUBM_RFN, PARENT, $<ctxt>5,
1931 GEDCOM_MAKE_NULL(val1));
1936 subm_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1937 { $<ctxt>$ = start_element(ELT_SUBM_RIN,
1939 GEDCOM_MAKE_STRING(val1, $4));
1940 START(RIN, $1, $<ctxt>$)
1945 { end_element(ELT_SUBM_RIN, PARENT, $<ctxt>5,
1946 GEDCOM_MAKE_NULL(val1));
1950 /*********************************************************************/
1951 /**** Substructures ****/
1952 /*********************************************************************/
1954 /* ADDRESS STRUCTURE */
1955 addr_struc_sub : addr_sect { OCCUR2(ADDR, 0, 1) }
1956 | phon_sect { OCCUR2(PHON, 0, 3) }
1959 addr_sect : OPEN DELIM TAG_ADDR mand_line_item
1960 { $<ctxt>$ = start_element(ELT_SUB_ADDR,
1962 GEDCOM_MAKE_STRING(val1, $4));
1963 reset_buffer(&concat_buffer);
1964 safe_buf_append(&concat_buffer, $4);
1965 START(ADDR, $1, $<ctxt>$)
1970 { char* complete = get_buf_string(&concat_buffer);
1971 end_element(ELT_SUB_ADDR, PARENT, $<ctxt>5,
1972 GEDCOM_MAKE_STRING(val1, complete));
1976 addr_subs : /* empty */
1977 | addr_subs addr_sub
1980 addr_sub : addr_cont_sect /* 0:M */
1981 | addr_adr1_sect { OCCUR2(ADR1, 0, 1) }
1982 | addr_adr2_sect { OCCUR2(ADR2, 0, 1) }
1983 | addr_city_sect { OCCUR2(CITY, 0, 1) }
1984 | addr_stae_sect { OCCUR2(STAE, 0, 1) }
1985 | addr_post_sect { OCCUR2(POST, 0, 1) }
1986 | addr_ctry_sect { OCCUR2(CTRY, 0, 1) }
1990 addr_cont_sect : OPEN DELIM TAG_CONT mand_line_item
1991 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CONT,
1993 GEDCOM_MAKE_STRING(val1, $4));
1994 SAFE_BUF_ADDCHAR(&concat_buffer, '\n');
1995 safe_buf_append(&concat_buffer, $4);
1996 START(CONT, $1, $<ctxt>$)
2001 { end_element(ELT_SUB_ADDR_CONT, PARENT, $<ctxt>5,
2002 GEDCOM_MAKE_NULL(val1));
2005 addr_adr1_sect : OPEN DELIM TAG_ADR1 mand_line_item
2006 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR1,
2008 GEDCOM_MAKE_STRING(val1, $4));
2009 START(ADR1, $1, $<ctxt>$)
2014 { end_element(ELT_SUB_ADDR_ADR1, PARENT, $<ctxt>5,
2015 GEDCOM_MAKE_NULL(val1));
2018 addr_adr2_sect : OPEN DELIM TAG_ADR2 mand_line_item
2019 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR2,
2021 GEDCOM_MAKE_STRING(val1, $4));
2022 START(ADR2, $1, $<ctxt>$)
2027 { end_element(ELT_SUB_ADDR_ADR2, PARENT, $<ctxt>5,
2028 GEDCOM_MAKE_NULL(val1));
2031 addr_city_sect : OPEN DELIM TAG_CITY mand_line_item
2032 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CITY,
2034 GEDCOM_MAKE_STRING(val1, $4));
2035 START(CITY, $1, $<ctxt>$)
2040 { end_element(ELT_SUB_ADDR_CITY, PARENT, $<ctxt>5,
2041 GEDCOM_MAKE_NULL(val1));
2044 addr_stae_sect : OPEN DELIM TAG_STAE mand_line_item
2045 { $<ctxt>$ = start_element(ELT_SUB_ADDR_STAE,
2047 GEDCOM_MAKE_STRING(val1, $4));
2048 START(STAE, $1, $<ctxt>$)
2053 { end_element(ELT_SUB_ADDR_STAE, PARENT, $<ctxt>5,
2054 GEDCOM_MAKE_NULL(val1));
2057 addr_post_sect : OPEN DELIM TAG_POST mand_line_item
2058 { $<ctxt>$ = start_element(ELT_SUB_ADDR_POST,
2060 GEDCOM_MAKE_STRING(val1, $4));
2061 START(POST, $1, $<ctxt>$)
2066 { end_element(ELT_SUB_ADDR_POST, PARENT, $<ctxt>5,
2067 GEDCOM_MAKE_NULL(val1));
2070 addr_ctry_sect : OPEN DELIM TAG_CTRY mand_line_item
2071 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CTRY,
2073 GEDCOM_MAKE_STRING(val1, $4));
2074 START(CTRY, $1, $<ctxt>$)
2079 { end_element(ELT_SUB_ADDR_CTRY, PARENT, $<ctxt>5,
2080 GEDCOM_MAKE_NULL(val1));
2084 phon_sect : OPEN DELIM TAG_PHON mand_line_item
2085 { $<ctxt>$ = start_element(ELT_SUB_PHON,
2087 GEDCOM_MAKE_STRING(val1, $4));
2088 START(PHON, $1, $<ctxt>$)
2093 { end_element(ELT_SUB_PHON, PARENT, $<ctxt>5,
2094 GEDCOM_MAKE_NULL(val1));
2098 /* ASSOCIATION STRUCTURE */
2099 assoc_struc_sub : asso_sect /* 0:M */
2102 asso_sect : OPEN DELIM TAG_ASSO mand_pointer
2103 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2105 if (xr == NULL) HANDLE_ERROR;
2106 $<ctxt>$ = start_element(ELT_SUB_ASSO,
2108 GEDCOM_MAKE_XREF_PTR(val1, xr));
2109 START(ASSO, $1, $<ctxt>$)
2112 { CHECK2(TYPE,RELA) }
2114 { end_element(ELT_SUB_ASSO, PARENT, $<ctxt>5,
2115 GEDCOM_MAKE_NULL(val1));
2119 asso_subs : /* empty */
2120 | asso_type_sect { OCCUR2(TYPE, 1, 1) }
2121 | asso_rela_sect { OCCUR2(RELA, 1, 1) }
2127 asso_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2128 { $<ctxt>$ = start_element(ELT_SUB_ASSO_TYPE,
2130 GEDCOM_MAKE_STRING(val1, $4));
2131 START(TYPE, $1, $<ctxt>$)
2136 { end_element(ELT_SUB_ASSO_TYPE, PARENT, $<ctxt>5,
2137 GEDCOM_MAKE_NULL(val1));
2141 asso_rela_sect : OPEN DELIM TAG_RELA mand_line_item
2142 { $<ctxt>$ = start_element(ELT_SUB_ASSO_RELA,
2144 GEDCOM_MAKE_STRING(val1, $4));
2145 START(RELA, $1, $<ctxt>$)
2150 { end_element(ELT_SUB_ASSO_RELA, PARENT, $<ctxt>5,
2151 GEDCOM_MAKE_NULL(val1));
2156 change_date_sub : change_date_chan_sect { OCCUR2(CHAN, 0, 1) }
2159 change_date_chan_sect : OPEN DELIM TAG_CHAN
2160 { $<ctxt>$ = start_element(ELT_SUB_CHAN,
2161 PARENT, $1, $3, NULL,
2162 GEDCOM_MAKE_NULL(val1));
2163 START(CHAN, $1, $<ctxt>$)
2165 change_date_chan_subs
2168 { end_element(ELT_SUB_CHAN, PARENT, $<ctxt>4,
2169 GEDCOM_MAKE_NULL(val1));
2173 change_date_chan_subs : /* empty */
2174 | change_date_chan_subs change_date_chan_sub
2177 change_date_chan_sub : change_date_date_sect { OCCUR2(DATE, 1, 1) }
2182 change_date_date_sect : OPEN DELIM TAG_DATE mand_line_item
2183 { struct date_value dv = gedcom_parse_date($4);
2184 $<ctxt>$ = start_element(ELT_SUB_CHAN_DATE,
2186 GEDCOM_MAKE_DATE(val1, dv));
2187 START(DATE, $1, $<ctxt>$) }
2188 change_date_date_subs
2191 { end_element(ELT_SUB_CHAN_DATE, PARENT, $<ctxt>5,
2192 GEDCOM_MAKE_NULL(val1));
2196 change_date_date_subs : /* empty */
2197 | change_date_date_subs change_date_date_sub
2200 change_date_date_sub : change_date_date_time_sect { OCCUR2(TIME, 0, 1) }
2204 change_date_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
2206 = start_element(ELT_SUB_CHAN_TIME,
2208 GEDCOM_MAKE_STRING(val1, $4));
2209 START(TIME, $1, $<ctxt>$)
2214 { end_element(ELT_SUB_CHAN_TIME, PARENT, $<ctxt>5,
2215 GEDCOM_MAKE_NULL(val1));
2219 /* CHILD TO FAMILY LINK */
2220 chi_fam_link_sub : famc_sect /* 0:M */
2223 famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2224 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2226 if (xr == NULL) HANDLE_ERROR;
2227 $<ctxt>$ = start_element(ELT_SUB_FAMC,
2229 GEDCOM_MAKE_XREF_PTR(val1, xr));
2230 START(FAMC, $1, $<ctxt>$)
2235 { end_element(ELT_SUB_FAMC, PARENT, $<ctxt>5,
2236 GEDCOM_MAKE_NULL(val1));
2240 famc_subs : /* empty */
2241 | famc_subs famc_sub
2244 famc_sub : famc_pedi_sect /* 0:M */
2249 famc_pedi_sect : OPEN DELIM TAG_PEDI mand_line_item
2250 { $<ctxt>$ = start_element(ELT_SUB_FAMC_PEDI,
2252 GEDCOM_MAKE_STRING(val1, $4));
2253 START(PEDI, $1, $<ctxt>$)
2258 { end_element(ELT_SUB_FAMC_PEDI, PARENT, $<ctxt>5,
2259 GEDCOM_MAKE_NULL(val1));
2263 /* CONTINUATION SUBSECTIONS */
2264 continuation_sub : cont_sect /* 0:M */
2265 | conc_sect /* 0:M */
2268 cont_sect : OPEN DELIM TAG_CONT mand_line_item
2269 { $<ctxt>$ = start_element(ELT_SUB_CONT,
2271 GEDCOM_MAKE_STRING(val1, $4));
2272 SAFE_BUF_ADDCHAR(&concat_buffer, '\n');
2273 safe_buf_append(&concat_buffer, $4);
2274 START(CONT, $1, $<ctxt>$)
2279 { end_element(ELT_SUB_CONT, PARENT, $<ctxt>5,
2280 GEDCOM_MAKE_NULL(val1));
2284 conc_sect : OPEN DELIM TAG_CONC mand_line_item
2285 { $<ctxt>$ = start_element(ELT_SUB_CONC,
2287 GEDCOM_MAKE_STRING(val1, $4));
2288 safe_buf_append(&concat_buffer, $4);
2289 START(CONC, $1, $<ctxt>$)
2294 { end_element(ELT_SUB_CONC, PARENT, $<ctxt>5,
2295 GEDCOM_MAKE_NULL(val1));
2300 event_detail_sub : event_detail_type_sect { OCCUR2(TYPE, 0, 1) }
2301 | event_detail_date_sect { OCCUR2(DATE, 0, 1) }
2304 | event_detail_age_sect { OCCUR2(AGE, 0, 1) }
2305 | event_detail_agnc_sect { OCCUR2(AGNC, 0, 1) }
2306 | event_detail_caus_sect { OCCUR2(CAUS, 0, 1) }
2312 event_detail_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2314 = start_element(ELT_SUB_EVT_TYPE,
2316 GEDCOM_MAKE_STRING(val1, $4));
2317 START(TYPE, $1, $<ctxt>$)
2322 { end_element(ELT_SUB_EVT_TYPE, PARENT, $<ctxt>5,
2323 GEDCOM_MAKE_NULL(val1));
2326 event_detail_date_sect : OPEN DELIM TAG_DATE mand_line_item
2327 { struct date_value dv = gedcom_parse_date($4);
2329 = start_element(ELT_SUB_EVT_DATE,
2331 GEDCOM_MAKE_DATE(val1, dv));
2332 START(DATE, $1, $<ctxt>$)
2337 { end_element(ELT_SUB_EVT_DATE, PARENT, $<ctxt>5,
2338 GEDCOM_MAKE_NULL(val1));
2341 event_detail_age_sect : OPEN DELIM TAG_AGE mand_line_item
2342 { struct age_value age = gedcom_parse_age($4);
2344 = start_element(ELT_SUB_EVT_AGE,
2346 GEDCOM_MAKE_AGE(val1, age));
2347 START(AGE, $1, $<ctxt>$)
2352 { end_element(ELT_SUB_EVT_AGE, PARENT, $<ctxt>5,
2353 GEDCOM_MAKE_NULL(val1));
2356 event_detail_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
2358 = start_element(ELT_SUB_EVT_AGNC,
2360 GEDCOM_MAKE_STRING(val1, $4));
2361 START(AGNC, $1, $<ctxt>$)
2366 { end_element(ELT_SUB_EVT_AGNC, PARENT, $<ctxt>5,
2367 GEDCOM_MAKE_NULL(val1));
2370 event_detail_caus_sect : OPEN DELIM TAG_CAUS mand_line_item
2372 = start_element(ELT_SUB_EVT_CAUS,
2374 GEDCOM_MAKE_STRING(val1, $4));
2375 START(CAUS, $1, $<ctxt>$)
2380 { end_element(ELT_SUB_EVT_CAUS, PARENT, $<ctxt>5,
2381 GEDCOM_MAKE_NULL(val1));
2385 /* FAMILY EVENT STRUCTURE */
2386 fam_event_struc_sub : fam_event_sect
2387 | fam_gen_even_sect /* 0:M */
2390 fam_event_sect : OPEN DELIM fam_event_tag opt_value
2392 = start_element(ELT_SUB_FAM_EVT,
2394 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2395 START2($1, $<ctxt>$);
2400 { end_element(ELT_SUB_FAM_EVT, PARENT, $<ctxt>5,
2401 GEDCOM_MAKE_NULL(val1));
2405 fam_event_tag : TAG_ANUL { $$ = $1; START1(ANUL) }
2406 | TAG_CENS { $$ = $1; START1(CENS) }
2407 | TAG_DIV { $$ = $1; START1(DIV) }
2408 | TAG_DIVF { $$ = $1; START1(DIVF) }
2409 | TAG_ENGA { $$ = $1; START1(ENGA) }
2410 | TAG_MARR { $$ = $1; START1(MARR) }
2411 | TAG_MARB { $$ = $1; START1(MARB) }
2412 | TAG_MARC { $$ = $1; START1(MARC) }
2413 | TAG_MARL { $$ = $1; START1(MARL) }
2414 | TAG_MARS { $$ = $1; START1(MARS) }
2417 fam_event_subs : /* empty */
2418 | fam_event_subs fam_event_sub
2421 fam_event_sub : event_detail_sub
2422 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2423 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2427 fam_even_husb_sect : OPEN DELIM TAG_HUSB
2428 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_HUSB,
2429 PARENT, $1, $3, NULL,
2430 GEDCOM_MAKE_NULL(val1));
2431 START(HUSB, $1, $<ctxt>$)
2436 { end_element(ELT_SUB_FAM_EVT_HUSB, PARENT, $<ctxt>4,
2437 GEDCOM_MAKE_NULL(val1));
2441 fam_even_husb_subs : /* empty */
2442 | fam_even_husb_subs fam_even_husb_sub
2445 fam_even_husb_sub : fam_even_age_sect { OCCUR2(AGE, 1, 1) }
2449 fam_even_age_sect : OPEN DELIM TAG_AGE mand_line_item
2450 { struct age_value age = gedcom_parse_age($4);
2451 $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_AGE,
2453 GEDCOM_MAKE_AGE(val1, age));
2454 START(AGE, $1, $<ctxt>$)
2459 { end_element(ELT_SUB_FAM_EVT_AGE, PARENT, $<ctxt>5,
2460 GEDCOM_MAKE_NULL(val1));
2464 fam_even_wife_sect : OPEN DELIM TAG_WIFE
2465 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_WIFE,
2466 PARENT, $1, $3, NULL,
2467 GEDCOM_MAKE_NULL(val1));
2468 START(WIFE, $1, $<ctxt>$)
2473 { end_element(ELT_SUB_FAM_EVT_WIFE, PARENT, $<ctxt>4,
2474 GEDCOM_MAKE_NULL(val1));
2478 fam_gen_even_sect : OPEN DELIM TAG_EVEN
2479 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_EVEN,
2480 PARENT, $1, $3, NULL,
2481 GEDCOM_MAKE_NULL(val1));
2482 START(EVEN, $1, $<ctxt>$)
2487 { end_element(ELT_SUB_FAM_EVT_EVEN, PARENT, $<ctxt>4,
2488 GEDCOM_MAKE_NULL(val1));
2492 fam_gen_even_subs : /* empty */
2493 | fam_gen_even_subs fam_gen_even_sub
2496 fam_gen_even_sub : event_detail_sub
2497 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2498 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2502 /* IDENTIFICATION STRUCTURE */
2503 ident_struc_sub : ident_refn_sect /* 0:M */
2504 | ident_rin_sect { OCCUR2(RIN, 0, 1) }
2507 ident_refn_sect : OPEN DELIM TAG_REFN mand_line_item
2508 { $<ctxt>$ = start_element(ELT_SUB_IDENT_REFN,
2510 GEDCOM_MAKE_STRING(val1, $4));
2511 START(REFN, $1, $<ctxt>$)
2516 { end_element(ELT_SUB_IDENT_REFN, PARENT, $<ctxt>5,
2517 GEDCOM_MAKE_NULL(val1));
2521 ident_refn_subs : /* empty */
2522 | ident_refn_subs ident_refn_sub
2525 ident_refn_sub : ident_refn_type_sect { OCCUR2(TYPE, 0, 1) }
2529 ident_refn_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2531 = start_element(ELT_SUB_IDENT_REFN_TYPE,
2533 GEDCOM_MAKE_STRING(val1, $4));
2534 START(TYPE, $1, $<ctxt>$)
2539 { end_element(ELT_SUB_IDENT_REFN_TYPE, PARENT, $<ctxt>5,
2540 GEDCOM_MAKE_NULL(val1));
2544 ident_rin_sect : OPEN DELIM TAG_RIN mand_line_item
2545 { $<ctxt>$ = start_element(ELT_SUB_IDENT_RIN,
2547 GEDCOM_MAKE_STRING(val1, $4));
2548 START(RIN, $1, $<ctxt>$)
2553 { end_element(ELT_SUB_IDENT_RIN, PARENT, $<ctxt>5,
2554 GEDCOM_MAKE_NULL(val1));
2558 /* INDIVIDUAL ATTRIBUTE STRUCTURE */
2559 indiv_attr_struc_sub : indiv_attr_sect /* 0:M */
2560 | indiv_resi_sect /* 0:M */
2563 indiv_attr_sect : OPEN DELIM indiv_attr_tag mand_line_item
2564 { $<ctxt>$ = start_element(ELT_SUB_INDIV_ATTR,
2566 GEDCOM_MAKE_STRING(val1, $4));
2567 START2($1, $<ctxt>$);
2569 indiv_attr_event_subs
2572 { end_element(ELT_SUB_INDIV_ATTR, PARENT, $<ctxt>5,
2573 GEDCOM_MAKE_NULL(val1));
2577 indiv_attr_tag : TAG_CAST { $$ = $1; START1(CAST) }
2578 | TAG_DSCR { $$ = $1; START1(DSCR) }
2579 | TAG_EDUC { $$ = $1; START1(EDUC) }
2580 | TAG_IDNO { $$ = $1; START1(IDNO) }
2581 | TAG_NATI { $$ = $1; START1(NATI) }
2582 | TAG_NCHI { $$ = $1; START1(NCHI) }
2583 | TAG_NMR { $$ = $1; START1(NMR) }
2584 | TAG_OCCU { $$ = $1; START1(OCCU) }
2585 | TAG_PROP { $$ = $1; START1(PROP) }
2586 | TAG_RELI { $$ = $1; START1(RELI) }
2587 | TAG_SSN { $$ = $1; START1(SSN) }
2588 | TAG_TITL { $$ = $1; START1(TITL) }
2591 indiv_resi_sect : OPEN DELIM TAG_RESI
2592 { $<ctxt>$ = start_element(ELT_SUB_INDIV_RESI,
2593 PARENT, $1, $3, NULL,
2594 GEDCOM_MAKE_NULL(val1));
2595 START(RESI, $1, $<ctxt>$)
2597 indiv_attr_event_subs
2600 { end_element(ELT_SUB_INDIV_RESI, PARENT, $<ctxt>4,
2601 GEDCOM_MAKE_NULL(val1));
2605 indiv_attr_event_subs : /* empty */
2606 | indiv_attr_event_subs indiv_attr_event_sub
2609 indiv_attr_event_sub : event_detail_sub
2613 /* INDIVIDUAL EVENT STRUCTURE */
2614 indiv_even_struc_sub : indiv_birt_sect
2616 | indiv_adop_sect /* 0:M */
2617 | indiv_even_sect /* 0:M */
2620 indiv_birt_sect : OPEN DELIM indiv_birt_tag opt_value
2622 = start_element(ELT_SUB_INDIV_BIRT,
2624 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2625 START2($1, $<ctxt>$);
2630 { end_element(ELT_SUB_INDIV_BIRT, PARENT, $<ctxt>5,
2631 GEDCOM_MAKE_NULL(val1));
2635 indiv_birt_tag : TAG_BIRT { $$ = $1; START1(BIRT) }
2636 | TAG_CHR { $$ = $1; START1(CHR) }
2639 indiv_birt_subs : /* empty */
2640 | indiv_birt_subs indiv_birt_sub
2643 indiv_birt_sub : event_detail_sub
2644 | indiv_birt_famc_sect { OCCUR2(FAMC,0, 1) }
2648 indiv_birt_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2649 { struct xref_value *xr = gedcom_parse_xref($4,
2652 if (xr == NULL) HANDLE_ERROR;
2654 = start_element(ELT_SUB_INDIV_BIRT_FAMC,
2656 GEDCOM_MAKE_XREF_PTR(val1, xr));
2657 START(FAMC, $1, $<ctxt>$)
2662 { end_element(ELT_SUB_INDIV_BIRT_FAMC, PARENT, $<ctxt>5,
2663 GEDCOM_MAKE_NULL(val1));
2667 indiv_gen_sect : OPEN DELIM indiv_gen_tag opt_value
2669 = start_element(ELT_SUB_INDIV_GEN,
2671 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2672 START2($1, $<ctxt>$);
2677 { end_element(ELT_SUB_INDIV_GEN, PARENT, $<ctxt>5,
2678 GEDCOM_MAKE_NULL(val1));
2682 indiv_gen_tag : TAG_DEAT { $$ = $1; START1(DEAT) }
2683 | TAG_BURI { $$ = $1; START1(BURI) }
2684 | TAG_CREM { $$ = $1; START1(CREM) }
2685 | TAG_BAPM { $$ = $1; START1(BAPM) }
2686 | TAG_BARM { $$ = $1; START1(BARM) }
2687 | TAG_BASM { $$ = $1; START1(BASM) }
2688 | TAG_BLES { $$ = $1; START1(BLES) }
2689 | TAG_CHRA { $$ = $1; START1(CHRA) }
2690 | TAG_CONF { $$ = $1; START1(CONF) }
2691 | TAG_FCOM { $$ = $1; START1(FCOM) }
2692 | TAG_ORDN { $$ = $1; START1(ORDN) }
2693 | TAG_NATU { $$ = $1; START1(NATU) }
2694 | TAG_EMIG { $$ = $1; START1(EMIG) }
2695 | TAG_IMMI { $$ = $1; START1(IMMI) }
2696 | TAG_CENS { $$ = $1; START1(CENS) }
2697 | TAG_PROB { $$ = $1; START1(PROB) }
2698 | TAG_WILL { $$ = $1; START1(WILL) }
2699 | TAG_GRAD { $$ = $1; START1(GRAD) }
2700 | TAG_RETI { $$ = $1; START1(RETI) }
2703 indiv_gen_subs : /* empty */
2704 | indiv_gen_subs indiv_gen_sub
2707 indiv_gen_sub : event_detail_sub
2711 indiv_adop_sect : OPEN DELIM TAG_ADOP opt_value
2713 = start_element(ELT_SUB_INDIV_ADOP,
2715 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2716 START(ADOP, $1, $<ctxt>$) }
2720 { end_element(ELT_SUB_INDIV_ADOP, PARENT, $<ctxt>5,
2721 GEDCOM_MAKE_NULL(val1));
2725 indiv_adop_subs : /* empty */
2726 | indiv_adop_subs indiv_adop_sub
2729 indiv_adop_sub : event_detail_sub
2730 | indiv_adop_famc_sect { OCCUR2(FAMC,0, 1) }
2734 indiv_adop_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2735 { struct xref_value *xr = gedcom_parse_xref($4,
2738 if (xr == NULL) HANDLE_ERROR;
2740 = start_element(ELT_SUB_INDIV_ADOP_FAMC,
2742 GEDCOM_MAKE_XREF_PTR(val1, xr));
2743 START(FAMC, $1, $<ctxt>$) }
2744 indiv_adop_famc_subs
2747 { end_element(ELT_SUB_INDIV_ADOP_FAMC, PARENT, $<ctxt>5,
2748 GEDCOM_MAKE_NULL(val1));
2752 indiv_adop_famc_subs : /* empty */
2753 | indiv_adop_famc_subs indiv_adop_famc_sub
2756 indiv_adop_famc_sub : indiv_adop_famc_adop_sect { OCCUR2(ADOP,0, 1) }
2760 indiv_adop_famc_adop_sect : OPEN DELIM TAG_ADOP mand_line_item
2762 = start_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2764 GEDCOM_MAKE_STRING(val1, $4));
2765 START(ADOP, $1, $<ctxt>$) }
2769 { end_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2771 GEDCOM_MAKE_NULL(val1));
2775 indiv_even_sect : OPEN DELIM TAG_EVEN
2776 { $<ctxt>$ = start_element(ELT_SUB_INDIV_EVEN,
2777 PARENT, $1, $3, NULL,
2778 GEDCOM_MAKE_NULL(val1));
2779 START(EVEN, $1, $<ctxt>$) }
2783 { end_element(ELT_SUB_INDIV_EVEN, PARENT, $<ctxt>4,
2784 GEDCOM_MAKE_NULL(val1));
2788 /* LDS INDIVIDUAL ORDINANCE */
2789 lds_indiv_ord_sub : lio_bapl_sect /* 0:M */
2790 | lio_slgc_sect /* 0:M */
2793 lio_bapl_sect : OPEN DELIM lio_bapl_tag
2794 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL,
2795 PARENT, $1, $3, NULL,
2796 GEDCOM_MAKE_NULL(val1));
2797 START2($1, $<ctxt>$);
2802 { end_element(ELT_SUB_LIO_BAPL, PARENT, $<ctxt>4,
2803 GEDCOM_MAKE_NULL(val1));
2807 lio_bapl_tag : TAG_BAPL { $$ = $1; START1(BAPL) }
2808 | TAG_CONL { $$ = $1; START1(CONL) }
2809 | TAG_ENDL { $$ = $1; START1(ENDL) }
2812 lio_bapl_subs : /* empty */
2813 | lio_bapl_subs lio_bapl_sub
2816 lio_bapl_sub : lio_bapl_stat_sect { OCCUR2(STAT, 0, 1) }
2817 | lio_bapl_date_sect { OCCUR2(DATE, 0, 1) }
2818 | lio_bapl_temp_sect { OCCUR2(TEMP, 0, 1) }
2819 | lio_bapl_plac_sect { OCCUR2(PLAC, 0, 1) }
2825 lio_bapl_stat_sect : OPEN DELIM TAG_STAT mand_line_item
2826 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_STAT,
2828 GEDCOM_MAKE_STRING(val1, $4));
2829 START(STAT, $1, $<ctxt>$)
2834 { end_element(ELT_SUB_LIO_BAPL_STAT, PARENT, $<ctxt>5,
2835 GEDCOM_MAKE_NULL(val1));
2838 lio_bapl_date_sect : OPEN DELIM TAG_DATE mand_line_item
2839 { struct date_value dv = gedcom_parse_date($4);
2840 $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_DATE,
2842 GEDCOM_MAKE_DATE(val1, dv));
2843 START(DATE, $1, $<ctxt>$)
2848 { end_element(ELT_SUB_LIO_BAPL_DATE, PARENT, $<ctxt>5,
2849 GEDCOM_MAKE_NULL(val1));
2852 lio_bapl_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
2853 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_TEMP,
2855 GEDCOM_MAKE_STRING(val1, $4));
2856 START(TEMP, $1, $<ctxt>$)
2861 { end_element(ELT_SUB_LIO_BAPL_TEMP, PARENT, $<ctxt>5,
2862 GEDCOM_MAKE_NULL(val1));
2865 lio_bapl_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
2866 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_PLAC,
2868 GEDCOM_MAKE_STRING(val1, $4));
2869 START(PLAC, $1, $<ctxt>$)
2874 { end_element(ELT_SUB_LIO_BAPL_PLAC, PARENT, $<ctxt>5,
2875 GEDCOM_MAKE_NULL(val1));
2879 lio_slgc_sect : OPEN DELIM TAG_SLGC
2880 { $<ctxt>$ = start_element(ELT_SUB_LIO_SLGC,
2881 PARENT, $1, $3, NULL,
2882 GEDCOM_MAKE_NULL(val1));
2883 START(SLGC, $1, $<ctxt>$)
2888 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4,
2889 GEDCOM_MAKE_NULL(val1));
2893 lio_slgc_subs : /* empty */
2894 | lio_slgc_subs lio_slgc_sub
2897 lio_slgc_sub : lio_bapl_sub
2898 | lio_slgc_famc_sect { OCCUR2(FAMC, 1, 1) }
2901 lio_slgc_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2902 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2904 if (xr == NULL) HANDLE_ERROR;
2906 = start_element(ELT_SUB_LIO_SLGC_FAMC,
2908 GEDCOM_MAKE_XREF_PTR(val1, xr));
2909 START(FAMC, $1, $<ctxt>$)
2914 { end_element(ELT_SUB_LIO_SLGC_FAMC, PARENT, $<ctxt>5,
2915 GEDCOM_MAKE_NULL(val1));
2919 /* LDS SPOUSE SEALING */
2920 lds_spouse_seal_sub : lss_slgs_sect
2923 lss_slgs_sect : OPEN DELIM TAG_SLGS
2924 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS,
2925 PARENT, $1, $3, NULL,
2926 GEDCOM_MAKE_NULL(val1));
2927 START(SLGS, $1, $<ctxt>$) }
2931 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4,
2932 GEDCOM_MAKE_NULL(val1));
2936 lss_slgs_subs : /* empty */
2937 | lss_slgs_subs lss_slgs_sub
2940 lss_slgs_sub : lss_slgs_stat_sect { OCCUR2(STAT, 0, 1) }
2941 | lss_slgs_date_sect { OCCUR2(DATE, 0, 1) }
2942 | lss_slgs_temp_sect { OCCUR2(TEMP, 0, 1) }
2943 | lss_slgs_plac_sect { OCCUR2(PLAC, 0, 1) }
2949 lss_slgs_stat_sect : OPEN DELIM TAG_STAT mand_line_item
2950 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_STAT,
2952 GEDCOM_MAKE_STRING(val1, $4));
2953 START(STAT, $1, $<ctxt>$)
2958 { end_element(ELT_SUB_LSS_SLGS_STAT, PARENT, $<ctxt>5,
2959 GEDCOM_MAKE_NULL(val1));
2962 lss_slgs_date_sect : OPEN DELIM TAG_DATE mand_line_item
2963 { struct date_value dv = gedcom_parse_date($4);
2964 $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_DATE,
2966 GEDCOM_MAKE_DATE(val1, dv));
2967 START(DATE, $1, $<ctxt>$)
2972 { end_element(ELT_SUB_LSS_SLGS_DATE, PARENT, $<ctxt>5,
2973 GEDCOM_MAKE_NULL(val1));
2976 lss_slgs_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
2977 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_TEMP,
2979 GEDCOM_MAKE_STRING(val1, $4));
2980 START(TEMP, $1, $<ctxt>$)
2985 { end_element(ELT_SUB_LSS_SLGS_TEMP, PARENT, $<ctxt>5,
2986 GEDCOM_MAKE_NULL(val1));
2989 lss_slgs_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
2990 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_PLAC,
2992 GEDCOM_MAKE_STRING(val1, $4));
2993 START(PLAC, $1, $<ctxt>$)
2998 { end_element(ELT_SUB_LSS_SLGS_PLAC, PARENT, $<ctxt>5,
2999 GEDCOM_MAKE_NULL(val1));
3003 /* MULTIMEDIA LINK */
3004 multim_link_sub : multim_obje_link_sect
3005 | multim_obje_emb_sect
3008 multim_obje_link_sect : OPEN DELIM TAG_OBJE DELIM POINTER
3009 { struct xref_value *xr = gedcom_parse_xref($5,
3012 if (xr == NULL) HANDLE_ERROR;
3014 = start_element(ELT_SUB_MULTIM_OBJE,
3016 GEDCOM_MAKE_XREF_PTR(val1, xr));
3017 START(OBJE, $1, $<ctxt>$)
3022 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>6,
3023 GEDCOM_MAKE_NULL(val1));
3027 multim_obje_emb_sect : OPEN DELIM TAG_OBJE
3028 { $<ctxt>$ = start_element(ELT_SUB_MULTIM_OBJE,
3029 PARENT, $1, $3, NULL,
3030 GEDCOM_MAKE_NULL(val1));
3031 START(OBJE, $1, $<ctxt>$)
3033 multim_obje_emb_subs
3034 { CHECK2(FORM,FILE) }
3036 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>4,
3037 GEDCOM_MAKE_NULL(val1));
3041 multim_obje_emb_subs : /* empty */
3042 | multim_obje_emb_subs multim_obje_emb_sub
3045 multim_obje_emb_sub : multim_obje_form_sect { OCCUR2(FORM, 1, 1) }
3046 | multim_obje_titl_sect { OCCUR2(TITL, 0, 1) }
3047 | multim_obje_file_sect { OCCUR2(FILE, 1, 1) }
3052 multim_obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
3054 = start_element(ELT_SUB_MULTIM_OBJE_FORM,
3056 GEDCOM_MAKE_STRING(val1, $4));
3057 START(FORM, $1, $<ctxt>$)
3062 { end_element(ELT_SUB_MULTIM_OBJE_FORM,
3064 GEDCOM_MAKE_NULL(val1));
3067 multim_obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
3069 = start_element(ELT_SUB_MULTIM_OBJE_TITL,
3071 GEDCOM_MAKE_STRING(val1, $4));
3072 START(TITL, $1, $<ctxt>$)
3077 { end_element(ELT_SUB_MULTIM_OBJE_TITL,
3079 GEDCOM_MAKE_NULL(val1));
3082 multim_obje_file_sect : OPEN DELIM TAG_FILE mand_line_item
3084 = start_element(ELT_SUB_MULTIM_OBJE_FILE,
3086 GEDCOM_MAKE_STRING(val1, $4));
3087 START(FILE, $1, $<ctxt>$)
3092 { end_element(ELT_SUB_MULTIM_OBJE_FILE,
3094 GEDCOM_MAKE_NULL(val1));
3098 /* NOTE STRUCTURE */
3099 note_struc_sub : note_struc_link_sect /* 0:M */
3100 | note_struc_emb_sect /* 0:M */
3103 note_struc_link_sect : OPEN DELIM TAG_NOTE DELIM POINTER
3104 { struct xref_value *xr = gedcom_parse_xref($5,
3107 if (xr == NULL) HANDLE_ERROR;
3109 = start_element(ELT_SUB_NOTE,
3111 GEDCOM_MAKE_XREF_PTR(val1, xr));
3112 START(NOTE, $1, $<ctxt>$)
3114 note_struc_link_subs
3117 { end_element(ELT_SUB_NOTE, PARENT, $<ctxt>6,
3118 GEDCOM_MAKE_NULL(val1));
3122 note_struc_link_subs : /* empty */
3123 | note_struc_link_subs note_struc_link_sub
3126 note_struc_link_sub : source_cit_sub
3130 note_struc_emb_sect : OPEN DELIM TAG_NOTE opt_line_item
3132 = start_element(ELT_SUB_NOTE,
3134 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
3135 reset_buffer(&concat_buffer);
3137 safe_buf_append(&concat_buffer, $4);
3138 START(NOTE, $1, $<ctxt>$)
3143 { char* complete = get_buf_string(&concat_buffer);
3144 end_element(ELT_SUB_NOTE, PARENT, $<ctxt>5,
3145 GEDCOM_MAKE_STRING(val1, complete));
3149 note_struc_emb_subs : /* empty */
3150 | note_struc_emb_subs note_struc_emb_sub
3153 note_struc_emb_sub : continuation_sub
3158 /* PERSONAL NAME STRUCTURE */
3159 pers_name_struc_sub : pers_name_sect /* 0:M */
3162 pers_name_sect : OPEN DELIM TAG_NAME mand_line_item
3163 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME,
3165 GEDCOM_MAKE_STRING(val1, $4));
3166 START(NAME, $1, $<ctxt>$)
3171 { end_element(ELT_SUB_PERS_NAME, PARENT, $<ctxt>5,
3172 GEDCOM_MAKE_NULL(val1));
3176 pers_name_subs : /* empty */
3177 | pers_name_subs pers_name_sub
3180 pers_name_sub : pers_name_npfx_sect { OCCUR2(NPFX, 0, 1) }
3181 | pers_name_givn_sect { OCCUR2(GIVN, 0, 1) }
3182 | pers_name_nick_sect { OCCUR2(NICK, 0, 1) }
3183 | pers_name_spfx_sect { OCCUR2(SPFX, 0, 1) }
3184 | pers_name_surn_sect { OCCUR2(SURN, 0, 1) }
3185 | pers_name_nsfx_sect { OCCUR2(NSFX, 0, 1) }
3191 pers_name_npfx_sect : OPEN DELIM TAG_NPFX mand_line_item
3192 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NPFX,
3194 GEDCOM_MAKE_STRING(val1, $4));
3195 START(NPFX, $1, $<ctxt>$)
3200 { end_element(ELT_SUB_PERS_NAME_NPFX, PARENT, $<ctxt>5,
3201 GEDCOM_MAKE_NULL(val1));
3204 pers_name_givn_sect : OPEN DELIM TAG_GIVN mand_line_item
3205 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_GIVN,
3207 GEDCOM_MAKE_STRING(val1, $4));
3208 START(GIVN, $1, $<ctxt>$)
3213 { end_element(ELT_SUB_PERS_NAME_GIVN, PARENT, $<ctxt>5,
3214 GEDCOM_MAKE_NULL(val1));
3217 pers_name_nick_sect : OPEN DELIM TAG_NICK mand_line_item
3218 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NICK,
3220 GEDCOM_MAKE_STRING(val1, $4));
3221 START(NICK, $1, $<ctxt>$)
3226 { end_element(ELT_SUB_PERS_NAME_NICK, PARENT, $<ctxt>5,
3227 GEDCOM_MAKE_NULL(val1));
3230 pers_name_spfx_sect : OPEN DELIM TAG_SPFX mand_line_item
3231 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SPFX,
3233 GEDCOM_MAKE_STRING(val1, $4));
3234 START(SPFX, $1, $<ctxt>$)
3239 { end_element(ELT_SUB_PERS_NAME_SPFX, PARENT, $<ctxt>5,
3240 GEDCOM_MAKE_NULL(val1));
3243 pers_name_surn_sect : OPEN DELIM TAG_SURN mand_line_item
3244 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SURN,
3246 GEDCOM_MAKE_STRING(val1, $4));
3247 START(SURN, $1, $<ctxt>$)
3252 { end_element(ELT_SUB_PERS_NAME_SURN, PARENT, $<ctxt>5,
3253 GEDCOM_MAKE_NULL(val1));
3256 pers_name_nsfx_sect : OPEN DELIM TAG_NSFX mand_line_item
3257 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NSFX,
3259 GEDCOM_MAKE_STRING(val1, $4));
3260 START(NSFX, $1, $<ctxt>$)
3265 { end_element(ELT_SUB_PERS_NAME_NSFX, PARENT, $<ctxt>5,
3266 GEDCOM_MAKE_NULL(val1));
3270 /* PLACE STRUCTURE */
3271 place_struc_sub : place_struc_plac_sect /* 0:M */
3274 place_struc_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
3276 = start_element(ELT_SUB_PLAC,
3278 GEDCOM_MAKE_STRING(val1, $4));
3279 START(PLAC, $1, $<ctxt>$)
3281 place_struc_plac_subs
3284 { end_element(ELT_SUB_PLAC, PARENT, $<ctxt>5,
3285 GEDCOM_MAKE_NULL(val1));
3289 place_struc_plac_subs : /* empty */
3290 | place_struc_plac_subs place_struc_plac_sub
3293 place_struc_plac_sub : place_plac_form_sect { OCCUR2(FORM, 0, 1) }
3299 place_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
3301 = start_element(ELT_SUB_PLAC_FORM,
3303 GEDCOM_MAKE_STRING(val1, $4));
3304 START(FORM, $1, $<ctxt>$)
3309 { end_element(ELT_SUB_PLAC_FORM, PARENT, $<ctxt>5,
3310 GEDCOM_MAKE_NULL(val1));
3314 /* SOURCE_CITATION */
3315 source_cit_sub : source_cit_link_sect /* 0:M */
3316 | source_cit_emb_sect /* 0:M */
3319 source_cit_link_sect : OPEN DELIM TAG_SOUR DELIM POINTER
3320 { struct xref_value *xr = gedcom_parse_xref($5,
3323 if (xr == NULL) HANDLE_ERROR;
3325 = start_element(ELT_SUB_SOUR,
3327 GEDCOM_MAKE_XREF_PTR(val1, xr));
3328 START(SOUR, $1, $<ctxt>$)
3330 source_cit_link_subs
3333 { end_element(ELT_SUB_SOUR, PARENT, $<ctxt>6,
3334 GEDCOM_MAKE_NULL(val1));
3338 source_cit_link_subs : /* empty */
3339 | source_cit_link_subs source_cit_link_sub
3342 source_cit_link_sub : source_cit_page_sect { OCCUR2(PAGE, 0, 1) }
3343 | source_cit_even_sect { OCCUR2(EVEN, 0, 1) }
3344 | source_cit_data_sect { OCCUR2(DATA, 0, 1) }
3345 | source_cit_quay_sect { OCCUR2(QUAY, 0, 1) }
3351 source_cit_page_sect : OPEN DELIM TAG_PAGE mand_line_item
3353 = start_element(ELT_SUB_SOUR_PAGE,
3355 GEDCOM_MAKE_STRING(val1, $4));
3356 START(PAGE, $1, $<ctxt>$)
3361 { end_element(ELT_SUB_SOUR_PAGE, PARENT, $<ctxt>5,
3362 GEDCOM_MAKE_NULL(val1));
3366 source_cit_even_sect : OPEN DELIM TAG_EVEN mand_line_item
3368 = start_element(ELT_SUB_SOUR_EVEN,
3370 GEDCOM_MAKE_STRING(val1, $4));
3371 START(EVEN, $1, $<ctxt>$)
3373 source_cit_even_subs
3376 { end_element(ELT_SUB_SOUR_EVEN, PARENT, $<ctxt>5,
3377 GEDCOM_MAKE_NULL(val1));
3381 source_cit_even_subs : /* empty */
3382 | source_cit_even_subs source_cit_even_sub
3385 source_cit_even_sub : source_cit_even_role_sect { OCCUR2(ROLE, 0, 1) }
3389 source_cit_even_role_sect : OPEN DELIM TAG_ROLE mand_line_item
3391 = start_element(ELT_SUB_SOUR_EVEN_ROLE,
3393 GEDCOM_MAKE_STRING(val1, $4));
3394 START(ROLE, $1, $<ctxt>$)
3399 { end_element(ELT_SUB_SOUR_EVEN_ROLE,
3401 GEDCOM_MAKE_NULL(val1));
3405 source_cit_data_sect : OPEN DELIM TAG_DATA
3406 { $<ctxt>$ = start_element(ELT_SUB_SOUR_DATA,
3407 PARENT, $1, $3, NULL,
3408 GEDCOM_MAKE_NULL(val1));
3409 START(DATA, $1, $<ctxt>$)
3411 source_cit_data_subs
3414 { end_element(ELT_SUB_SOUR_DATA, PARENT, $<ctxt>4,
3415 GEDCOM_MAKE_NULL(val1));
3419 source_cit_data_subs : /* empty */
3420 | source_cit_data_subs source_cit_data_sub
3423 source_cit_data_sub : source_cit_data_date_sect { OCCUR2(DATE, 0, 1) }
3424 | source_cit_text_sect /* 0:M */
3428 source_cit_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
3429 { struct date_value dv = gedcom_parse_date($4);
3431 = start_element(ELT_SUB_SOUR_DATA_DATE,
3433 GEDCOM_MAKE_DATE(val1, dv));
3434 START(DATE, $1, $<ctxt>$)
3439 { end_element(ELT_SUB_SOUR_DATA_DATE,
3441 GEDCOM_MAKE_NULL(val1));
3445 source_cit_text_sect : OPEN DELIM TAG_TEXT mand_line_item
3447 = start_element(ELT_SUB_SOUR_TEXT,
3449 GEDCOM_MAKE_STRING(val1, $4));
3450 reset_buffer(&concat_buffer);
3451 safe_buf_append(&concat_buffer, $4);
3452 START(TEXT, $1, $<ctxt>$)
3454 source_cit_text_subs
3457 { char* complete = get_buf_string(&concat_buffer);
3458 end_element(ELT_SUB_SOUR_TEXT, PARENT, $<ctxt>5,
3459 GEDCOM_MAKE_STRING(val1, complete));
3463 source_cit_text_subs : /* empty */
3464 | source_cit_text_subs source_cit_text_sub
3467 source_cit_text_sub : continuation_sub
3471 source_cit_quay_sect : OPEN DELIM TAG_QUAY mand_line_item
3473 = start_element(ELT_SUB_SOUR_QUAY,
3475 GEDCOM_MAKE_STRING(val1, $4));
3476 START(QUAY, $1, $<ctxt>$)
3481 { end_element(ELT_SUB_SOUR_QUAY, PARENT, $<ctxt>5,
3482 GEDCOM_MAKE_NULL(val1));
3486 source_cit_emb_sect : OPEN DELIM TAG_SOUR mand_line_item
3487 { $<ctxt>$ = start_element(ELT_SUB_SOUR,
3489 GEDCOM_MAKE_STRING(val1, $4));
3490 reset_buffer(&concat_buffer);
3491 safe_buf_append(&concat_buffer, $4);
3492 START(SOUR, $1, $<ctxt>$)
3497 { char* complete = get_buf_string(&concat_buffer);
3498 end_element(ELT_SUB_SOUR, PARENT, $<ctxt>5,
3499 GEDCOM_MAKE_STRING(val1, complete));
3503 source_cit_emb_subs : /* empty */
3504 | source_cit_emb_subs source_cit_emb_sub
3507 source_cit_emb_sub : continuation_sub
3508 | source_cit_text_sect /* 0:M */
3513 /* SOURCE REPOSITORY CITATION */
3514 source_repos_cit_sub : source_repos_repo_sect { OCCUR2(REPO, 0, 1) }
3517 source_repos_repo_sect : OPEN DELIM TAG_REPO mand_pointer
3518 { struct xref_value *xr
3519 = gedcom_parse_xref($4, XREF_USED, XREF_REPO);
3520 if (xr == NULL) HANDLE_ERROR;
3522 = start_element(ELT_SUB_REPO,
3524 GEDCOM_MAKE_XREF_PTR(val1, xr));
3525 START(REPO, $1, $<ctxt>$)
3527 source_repos_repo_subs
3530 { end_element(ELT_SUB_REPO, PARENT, $<ctxt>5,
3531 GEDCOM_MAKE_NULL(val1));
3535 source_repos_repo_subs : /* empty */
3536 | source_repos_repo_subs source_repos_repo_sub
3539 source_repos_repo_sub : note_struc_sub
3540 | caln_sect /* 0:M */
3544 caln_sect : OPEN DELIM TAG_CALN mand_line_item
3545 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN,
3547 GEDCOM_MAKE_STRING(val1, $4));
3548 START(CALN, $1, $<ctxt>$)
3553 { end_element(ELT_SUB_REPO_CALN, PARENT, $<ctxt>5,
3554 GEDCOM_MAKE_NULL(val1));
3558 caln_subs : /* empty */
3559 | caln_subs caln_sub
3562 caln_sub : caln_medi_sect { OCCUR2(MEDI, 0, 1) }
3566 caln_medi_sect : OPEN DELIM TAG_MEDI mand_line_item
3567 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN_MEDI,
3569 GEDCOM_MAKE_STRING(val1, $4));
3570 START(MEDI, $1, $<ctxt>$)
3575 { end_element(ELT_SUB_REPO_CALN_MEDI, PARENT, $<ctxt>5,
3576 GEDCOM_MAKE_NULL(val1));
3580 /* SPOUSE TO FAMILY LINK */
3581 spou_fam_link_sub : spou_fam_fams_sect /* 0:M */
3584 spou_fam_fams_sect : OPEN DELIM TAG_FAMS mand_pointer
3585 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
3587 if (xr == NULL) HANDLE_ERROR;
3589 = start_element(ELT_SUB_FAMS,
3591 GEDCOM_MAKE_XREF_PTR(val1, xr));
3592 START(FAMS, $1, $<ctxt>$)
3597 { end_element(ELT_SUB_FAMS, PARENT, $<ctxt>5,
3598 GEDCOM_MAKE_NULL(val1));
3602 spou_fam_fams_subs : /* empty */
3603 | spou_fam_fams_subs spou_fam_fams_sub
3606 spou_fam_fams_sub : note_struc_sub
3610 /*********************************************************************/
3612 /*********************************************************************/
3614 no_std_subs : /* empty */
3615 | no_std_subs no_std_sub
3618 no_std_sub : user_sect /* 0:M */
3621 CLOSE { HANDLE_ERROR }
3624 no_std_rec : user_rec /* 0:M */
3627 CLOSE { HANDLE_ERROR }
3630 user_rec : OPEN DELIM opt_xref USERTAG
3631 { if ($4.string[0] != '_') {
3632 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3638 { struct xref_value *xr = NULL;
3640 xr = gedcom_parse_xref($3, XREF_DEFINED, XREF_USER);
3641 if (xr == NULL) HANDLE_ERROR;
3643 $<ctxt>$ = start_record(REC_USER,
3645 GEDCOM_MAKE_NULL_OR_XREF_PTR(val1, xr),
3647 START($4, $1, $<ctxt>$)
3652 { end_record(REC_USER, $<ctxt>7, GEDCOM_MAKE_NULL(val1)); }
3654 user_sect : OPEN DELIM opt_xref USERTAG
3655 { if ($4.string[0] != '_') {
3656 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3662 { $<ctxt>$ = start_element(ELT_USER, PARENT, $1, $4, $6, &val2);
3663 START($4, $1, $<ctxt>$);
3668 { end_element(ELT_USER, PARENT, $<ctxt>7,
3669 GEDCOM_MAKE_NULL(val1));
3673 user_sects : /* empty */ { }
3674 | user_sects user_sect { }
3677 opt_xref : /* empty */ { $$ = NULL; }
3678 | POINTER DELIM { $$ = $1; }
3681 opt_value : /* empty */ { GEDCOM_MAKE_NULL(val2);
3683 | DELIM POINTER { struct xref_value *xr
3684 = gedcom_parse_xref($2, XREF_USED,
3686 GEDCOM_MAKE_XREF_PTR(val2, xr);
3688 | DELIM line_item { GEDCOM_MAKE_STRING(val2, $2);
3692 mand_pointer : /* empty */ { gedcom_error(_("Missing pointer")); YYERROR; }
3693 | DELIM POINTER { gedcom_debug_print("==Ptr: %s==", $2);
3697 mand_line_item : /* empty */
3698 { if (compat_mode(C_LIFELINES)) {
3699 /* Lifelines tends to not care about mandatory values */
3700 gedcom_debug_print("==Val: ==");
3704 gedcom_error(_("Missing value")); YYERROR;
3707 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3711 opt_line_item : /* empty */ { $$ = NULL; }
3712 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3716 line_item : anychar { size_t i;
3717 reset_buffer(&line_item_buffer);
3718 /* The following also takes care of '@@' */
3719 if (!strncmp($1, "@@", 3))
3720 SAFE_BUF_ADDCHAR(&line_item_buffer, '@')
3722 for (i=0; i < strlen($1); i++)
3723 SAFE_BUF_ADDCHAR(&line_item_buffer, $1[i])
3724 $$ = get_buf_string(&line_item_buffer);
3726 | ESCAPE { size_t i;
3727 reset_buffer(&line_item_buffer);
3728 for (i=0; i < strlen($1); i++)
3729 SAFE_BUF_ADDCHAR(&line_item_buffer, $1[i])
3730 $$ = get_buf_string(&line_item_buffer);
3734 /* The following also takes care of '@@' */
3735 if (!strncmp($2, "@@", 3))
3736 SAFE_BUF_ADDCHAR(&line_item_buffer, '@')
3738 for (i=0; i < strlen($2); i++)
3739 SAFE_BUF_ADDCHAR(&line_item_buffer, $2[i])
3740 $$ = get_buf_string(&line_item_buffer);
3744 for (i=0; i < strlen($2); i++)
3745 SAFE_BUF_ADDCHAR(&line_item_buffer, $2[i])
3746 $$ = get_buf_string(&line_item_buffer);
3748 | line_item error anychar { HANDLE_ERROR; }
3749 | line_item error ESCAPE { HANDLE_ERROR; }
3752 anychar : ANYCHAR { }
3756 error_subs : /* empty */
3757 | error_subs error_sect
3760 error_sect : OPEN DELIM opt_xref anytag opt_value error_subs CLOSE { }
3763 gen_sect : OPEN DELIM opt_xref anystdtag
3764 { INVALID_TAG($4.string); }
3765 opt_value opt_sects CLOSE
3769 gen_rec : gen_rec_top
3773 gen_rec_norm : OPEN DELIM opt_xref anystdtag
3774 { INVALID_TOP_TAG($4.string) }
3775 opt_value opt_sects CLOSE
3779 gen_rec_top : OPEN DELIM anytoptag
3780 { gedcom_error(_("Missing cross-reference")); YYERROR; }
3781 opt_value opt_sects CLOSE
3785 opt_sects : /* empty */ { }
3786 | opt_sects gen_sect { }
3789 anytag : USERTAG { }
3803 anystdtag : TAG_ABBR
3934 /* Functions that handle the counting of subtags */
3936 int* count_arrays[MAXGEDCLEVEL+1];
3937 char tag_stack[MAXGEDCLEVEL+1][MAXSTDTAGLEN+1];
3938 Gedcom_ctxt ctxt_stack[MAXGEDCLEVEL+1];
3940 void push_countarray(int level)
3943 gedcom_debug_print("Push Count level: %d, level: %d\n", count_level, level);
3944 if (count_level != level + 1) {
3945 gedcom_error(_("Internal error: count level mismatch"));
3948 if (count_level > MAXGEDCLEVEL) {
3949 gedcom_error(_("Internal error: count array overflow"));
3953 gedcom_debug_print("calloc countarray %d\n", count_level);
3954 count = (int *)calloc(YYNTOKENS, sizeof(int));
3955 if (count == NULL) {
3956 gedcom_error(_("Internal error: count array calloc error"));
3960 count_arrays[count_level] = count;
3965 void set_parenttag(const char* tag)
3967 strncpy(tag_stack[count_level+1], tag, MAXSTDTAGLEN+1);
3970 void set_parentctxt(Gedcom_ctxt ctxt)
3972 ctxt_stack[count_level+1] = ctxt;
3975 char* get_parenttag(int offset)
3977 return tag_stack[count_level - offset];
3980 Gedcom_ctxt get_parentctxt(int offset)
3982 return ctxt_stack[count_level - offset];
3985 int count_tag(int tag)
3987 int *count = count_arrays[count_level];
3988 return ++count[tag - GEDCOMTAGOFFSET];
3991 int check_occurrence(int tag)
3993 int *count = count_arrays[count_level];
3994 return (count[tag - GEDCOMTAGOFFSET] > 0);
3997 void pop_countarray()
4000 gedcom_debug_print("Pop Count level: %d\n", count_level);
4001 if (count_level < 0) {
4002 gedcom_error(_("Internal error: count array underflow"));
4006 count = count_arrays[count_level];
4007 gedcom_debug_print("free countarray %d\n", count_level);
4009 count_arrays[count_level] = NULL;
4015 gedcom_debug_print("Cleanup countarrays\n");
4016 while (count_level > 0) {
4022 void cleanup_concat_buffer()
4024 cleanup_buffer(&concat_buffer);
4027 void cleanup_line_item_buffer()
4029 cleanup_buffer(&line_item_buffer);
4032 /* Enabling debug mode */
4033 /* level 0: no debugging */
4034 /* level 1: only internal */
4035 /* level 2: also bison */
4038 void gedcom_set_debug_level(int level, FILE* f)
4043 trace_output = stderr;
4045 gedcom_high_level_debug = 1;
4054 int gedcom_debug_print(const char* s, ...)
4057 if (gedcom_high_level_debug) {
4060 res = vfprintf(trace_output, s, ap);
4062 fprintf(trace_output, "\n");
4067 /* Setting the error mechanism */
4068 void gedcom_set_error_handling(Gedcom_err_mech mechanism)
4070 error_mechanism = mechanism;