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 void cleanup_usertag_buffer();
169 struct safe_buffer usertag_buffer = { NULL, 0, NULL, 0,
170 cleanup_usertag_buffer};
172 /* These are defined at the bottom of the file */
173 void push_countarray(int level);
174 void set_parenttag(const char* tag);
175 char* get_parenttag(int offset);
176 void set_parentctxt(Gedcom_ctxt ctxt);
177 Gedcom_ctxt get_parentctxt(int offset);
178 void pop_countarray();
179 int count_tag(int tag);
180 int check_occurrence(int tag);
183 #define HANDLE_ERROR \
184 { if (error_mechanism == IMMED_FAIL) { \
185 clean_up(); YYABORT; \
187 else if (error_mechanism == DEFER_FAIL) { \
188 gedcom_debug_print("Fail on line %d", line_no); \
191 else if (error_mechanism == IGNORE_ERRORS) { \
195 #define START1(PARENTTAG) \
196 { set_parenttag(#PARENTTAG); \
198 #define START2(LEVEL,PARENTCTXT) \
199 { set_parentctxt(PARENTCTXT); \
201 push_countarray(LEVEL); \
203 #define START(PARENTTAG,LEVEL,PARENTCTXT) \
204 { START1(PARENTTAG); \
205 START2(LEVEL,PARENTCTXT); \
209 #define GRANDPARENT(OFF) \
212 { if (!check_occurrence(TAG_##TAG)) { \
213 char* parenttag = get_parenttag(0); \
214 gedcom_error(_("The tag '%s' is mandatory within '%s', but missing"),\
219 #define CHK_COND(TAG) \
220 check_occurrence(TAG_##TAG)
222 { pop_countarray(); \
226 #define CHECK1(TAG1) { CHK(TAG1); POP; }
227 #define CHECK2(TAG1,TAG2) \
228 { CHK(TAG1); CHK(TAG2); POP; }
229 #define CHECK3(TAG1,TAG2,TAG3) \
230 { CHK(TAG1); CHK(TAG2); CHK(TAG3); POP; }
231 #define CHECK4(TAG1,TAG2,TAG3,TAG4) \
232 { CHK(TAG1); CHK(TAG2); CHK(TAG3); CHK(TAG4); POP; }
233 #define OCCUR1(CHILDTAG, MIN) { count_tag(TAG_##CHILDTAG); }
234 #define OCCUR2(CHILDTAG, MIN, MAX) \
235 { int num = count_tag(TAG_##CHILDTAG); \
237 char* parenttag = get_parenttag(0); \
238 gedcom_error(_("The tag '%s' can maximally occur %d time(s) within '%s'"), \
239 #CHILDTAG, MAX, parenttag); \
243 #define INVALID_TAG(CHILDTAG) \
244 { char* parenttag = get_parenttag(0); \
245 gedcom_error(_("The tag '%s' is not a valid tag within '%s'"), \
246 CHILDTAG, parenttag); \
249 #define INVALID_TOP_TAG(CHILDTAG) \
250 { gedcom_error(_("The tag '%s' is not a valid top-level tag"), \
260 struct tag_struct tag;
267 %token <string> BADTOKEN
269 %token <string> CLOSE
270 %token <string> ESCAPE
271 %token <string> DELIM
272 %token <string> ANYCHAR
273 %token <string> POINTER
275 %token <tag> TAG_ABBR
276 %token <tag> TAG_ADDR
277 %token <tag> TAG_ADR1
278 %token <tag> TAG_ADR2
279 %token <tag> TAG_ADOP
282 %token <tag> TAG_AGNC
283 %token <tag> TAG_ALIA
284 %token <tag> TAG_ANCE
285 %token <tag> TAG_ANCI
286 %token <tag> TAG_ANUL
287 %token <tag> TAG_ASSO
288 %token <tag> TAG_AUTH
289 %token <tag> TAG_BAPL
290 %token <tag> TAG_BAPM
291 %token <tag> TAG_BARM
292 %token <tag> TAG_BASM
293 %token <tag> TAG_BIRT
294 %token <tag> TAG_BLES
295 %token <tag> TAG_BLOB
296 %token <tag> TAG_BURI
297 %token <tag> TAG_CALN
298 %token <tag> TAG_CAST
299 %token <tag> TAG_CAUS
300 %token <tag> TAG_CENS
301 %token <tag> TAG_CHAN
302 %token <tag> TAG_CHAR
303 %token <tag> TAG_CHIL
305 %token <tag> TAG_CHRA
306 %token <tag> TAG_CITY
307 %token <tag> TAG_CONC
308 %token <tag> TAG_CONF
309 %token <tag> TAG_CONL
310 %token <tag> TAG_CONT
311 %token <tag> TAG_COPR
312 %token <tag> TAG_CORP
313 %token <tag> TAG_CREM
314 %token <tag> TAG_CTRY
315 %token <tag> TAG_DATA
316 %token <tag> TAG_DATE
317 %token <tag> TAG_DEAT
318 %token <tag> TAG_DESC
319 %token <tag> TAG_DESI
320 %token <tag> TAG_DEST
322 %token <tag> TAG_DIVF
323 %token <tag> TAG_DSCR
324 %token <tag> TAG_EDUC
325 %token <tag> TAG_EMIG
326 %token <tag> TAG_ENDL
327 %token <tag> TAG_ENGA
328 %token <tag> TAG_EVEN
330 %token <tag> TAG_FAMC
331 %token <tag> TAG_FAMF
332 %token <tag> TAG_FAMS
333 %token <tag> TAG_FCOM
334 %token <tag> TAG_FILE
335 %token <tag> TAG_FORM
336 %token <tag> TAG_GEDC
337 %token <tag> TAG_GIVN
338 %token <tag> TAG_GRAD
339 %token <tag> TAG_HEAD
340 %token <tag> TAG_HUSB
341 %token <tag> TAG_IDNO
342 %token <tag> TAG_IMMI
343 %token <tag> TAG_INDI
344 %token <tag> TAG_LANG
345 %token <tag> TAG_LEGA
346 %token <tag> TAG_MARB
347 %token <tag> TAG_MARC
348 %token <tag> TAG_MARL
349 %token <tag> TAG_MARR
350 %token <tag> TAG_MARS
351 %token <tag> TAG_MEDI
352 %token <tag> TAG_NAME
353 %token <tag> TAG_NATI
354 %token <tag> TAG_NATU
355 %token <tag> TAG_NCHI
356 %token <tag> TAG_NICK
358 %token <tag> TAG_NOTE
359 %token <tag> TAG_NPFX
360 %token <tag> TAG_NSFX
361 %token <tag> TAG_OBJE
362 %token <tag> TAG_OCCU
363 %token <tag> TAG_ORDI
364 %token <tag> TAG_ORDN
365 %token <tag> TAG_PAGE
366 %token <tag> TAG_PEDI
367 %token <tag> TAG_PHON
368 %token <tag> TAG_PLAC
369 %token <tag> TAG_POST
370 %token <tag> TAG_PROB
371 %token <tag> TAG_PROP
372 %token <tag> TAG_PUBL
373 %token <tag> TAG_QUAY
374 %token <tag> TAG_REFN
375 %token <tag> TAG_RELA
376 %token <tag> TAG_RELI
377 %token <tag> TAG_REPO
378 %token <tag> TAG_RESI
379 %token <tag> TAG_RESN
380 %token <tag> TAG_RETI
383 %token <tag> TAG_ROLE
385 %token <tag> TAG_SLGC
386 %token <tag> TAG_SLGS
387 %token <tag> TAG_SOUR
388 %token <tag> TAG_SPFX
390 %token <tag> TAG_STAE
391 %token <tag> TAG_STAT
392 %token <tag> TAG_SUBM
393 %token <tag> TAG_SUBN
394 %token <tag> TAG_SURN
395 %token <tag> TAG_TEMP
396 %token <tag> TAG_TEXT
397 %token <tag> TAG_TIME
398 %token <tag> TAG_TITL
399 %token <tag> TAG_TRLR
400 %token <tag> TAG_TYPE
401 %token <tag> TAG_VERS
402 %token <tag> TAG_WIFE
403 %token <tag> TAG_WILL
405 %type <tag> anystdtag
406 %type <tag> anytoptag
407 %type <tag> fam_event_tag
408 %type <tag> indiv_attr_tag
409 %type <tag> indiv_birt_tag
410 %type <tag> indiv_gen_tag
411 %type <tag> lio_bapl_tag
412 %type <string> line_item
413 %type <string> mand_line_item
414 %type <string> mand_pointer
415 %type <string> note_line_item
416 %type <string> anychar
417 %type <string> opt_xref
418 %type <string> opt_value
419 %type <string> opt_line_item
420 %type <ctxt> head_sect
424 file : head_sect records trlr_sect
425 { if (fail == 1) YYABORT; }
430 records : /* empty */
445 /*********************************************************************/
447 /*********************************************************************/
448 head_sect : OPEN DELIM TAG_HEAD
449 { $<ctxt>$ = start_record(REC_HEAD, $1, GEDCOM_MAKE_NULL(val1),
451 NULL, GEDCOM_MAKE_NULL(val2));
452 START(HEAD, $1, $<ctxt>$) }
454 { if (compat_mode(C_NO_SUBMITTER) && ! CHK_COND(SUBM))
455 compat_generate_submitter_link($<ctxt>4);
458 if (compat_mode(C_NO_GEDC) && ! CHK_COND(GEDC))
459 compat_generate_gedcom($<ctxt>4);
462 if (compat_mode(C_NO_CHAR) && ! CHK_COND(CHAR)) {
463 if (compat_generate_char($<ctxt>4)) HANDLE_ERROR;
470 { end_record(REC_HEAD, $<ctxt>4, GEDCOM_MAKE_NULL(val1));
471 if (compat_mode(C_NO_SUBMITTER))
472 compat_generate_submitter();
476 head_subs : /* empty */
480 head_sub : head_sour_sect { OCCUR2(SOUR, 1, 1) }
481 | head_dest_sect { OCCUR2(DEST, 0, 1) }
482 | head_date_sect { OCCUR2(DATE, 0, 1) }
483 | head_time_sect { if (!compat_mode(C_HEAD_TIME))
486 | head_subm_sect { OCCUR2(SUBM, 1, 1) }
487 | head_subn_sect { OCCUR2(SUBN, 0, 1) }
488 | head_file_sect { OCCUR2(FILE, 0, 1) }
489 | head_copr_sect { OCCUR2(COPR, 0, 1) }
490 | head_gedc_sect { OCCUR2(GEDC, 1, 1) }
491 | head_char_sect { OCCUR2(CHAR, 1, 1) }
492 | head_lang_sect { OCCUR2(LANG, 0, 1) }
493 | head_plac_sect { OCCUR2(PLAC, 0, 1) }
494 | head_note_sect { OCCUR2(NOTE, 0, 1) }
499 head_sour_sect : OPEN DELIM TAG_SOUR mand_line_item
500 { set_compatibility_program($4);
501 $<ctxt>$ = start_element(ELT_HEAD_SOUR, PARENT,
503 GEDCOM_MAKE_STRING(val1, $4));
504 START(SOUR, $1, $<ctxt>$)
509 { compute_compatibility();
510 end_element(ELT_HEAD_SOUR, PARENT, $<ctxt>5,
511 GEDCOM_MAKE_NULL(val1)); }
514 head_sour_subs : /* empty */
515 | head_sour_subs head_sour_sub
518 head_sour_sub : head_sour_vers_sect { OCCUR2(VERS, 0, 1) }
519 | head_sour_name_sect { OCCUR2(NAME, 0, 1) }
520 | head_sour_corp_sect { OCCUR2(CORP, 0, 1) }
521 | head_sour_data_sect { OCCUR2(DATA, 0, 1) }
525 head_sour_vers_sect : OPEN DELIM TAG_VERS mand_line_item
526 { set_compatibility_version($4);
527 $<ctxt>$ = start_element(ELT_HEAD_SOUR_VERS, PARENT,
529 GEDCOM_MAKE_STRING(val1, $4));
530 START(VERS, $1, $<ctxt>$)
535 { end_element(ELT_HEAD_SOUR_VERS,
536 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
539 head_sour_name_sect : OPEN DELIM TAG_NAME mand_line_item
540 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_NAME, PARENT,
542 GEDCOM_MAKE_STRING(val1, $4));
543 START(NAME, $1, $<ctxt>$)
548 { end_element(ELT_HEAD_SOUR_NAME,
549 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
552 head_sour_corp_sect : OPEN DELIM TAG_CORP mand_line_item
553 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_CORP, PARENT,
555 GEDCOM_MAKE_STRING(val1, $4));
556 START(CORP, $1, $<ctxt>$)
561 { end_element(ELT_HEAD_SOUR_CORP,
562 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
566 head_sour_corp_subs : /* empty */
567 | head_sour_corp_subs head_sour_corp_sub
570 head_sour_corp_sub : addr_struc_sub /* 0:1 */
574 head_sour_data_sect : OPEN DELIM TAG_DATA mand_line_item
575 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_DATA, PARENT,
577 GEDCOM_MAKE_STRING(val1, $4));
578 START(DATA, $1, $<ctxt>$)
583 { end_element(ELT_HEAD_SOUR_DATA,
584 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
588 head_sour_data_subs : /* empty */
589 | head_sour_data_subs head_sour_data_sub
592 head_sour_data_sub : head_sour_data_date_sect { OCCUR2(DATE, 0, 1) }
593 | head_sour_data_copr_sect { OCCUR2(COPR, 0, 1) }
597 head_sour_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
598 { struct date_value dv = gedcom_parse_date($4);
600 = start_element(ELT_HEAD_SOUR_DATA_DATE,
602 GEDCOM_MAKE_DATE(val1, dv));
603 START(DATE, $1, $<ctxt>$)
608 { end_element(ELT_HEAD_SOUR_DATA_DATE,
610 GEDCOM_MAKE_NULL(val1));
613 head_sour_data_copr_sect : OPEN DELIM TAG_COPR mand_line_item
615 = start_element(ELT_HEAD_SOUR_DATA_COPR,
617 GEDCOM_MAKE_STRING(val1, $4));
618 START(COPR, $1, $<ctxt>$)
623 { end_element(ELT_HEAD_SOUR_DATA_COPR,
625 GEDCOM_MAKE_NULL(val1));
630 head_dest_sect : OPEN DELIM TAG_DEST mand_line_item
631 { $<ctxt>$ = start_element(ELT_HEAD_DEST,
633 GEDCOM_MAKE_STRING(val1, $4));
634 START(DEST, $1, $<ctxt>$)
639 { end_element(ELT_HEAD_DEST,
640 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
645 head_date_sect : OPEN DELIM TAG_DATE mand_line_item
646 { struct date_value dv = gedcom_parse_date($4);
647 $<ctxt>$ = start_element(ELT_HEAD_DATE,
649 GEDCOM_MAKE_DATE(val1, dv));
650 if (compat_mode(C_HEAD_TIME))
651 compat_save_head_date_context($<ctxt>$);
652 START(DATE, $1, $<ctxt>$)
657 { end_element(ELT_HEAD_DATE,
658 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
662 head_date_subs : /* empty */
663 | head_date_subs head_date_sub
666 head_date_sub : head_date_time_sect { OCCUR2(TIME, 0, 1) }
670 head_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
671 { $<ctxt>$ = start_element(ELT_HEAD_DATE_TIME,
673 GEDCOM_MAKE_STRING(val1, $4));
674 START(TIME, $1, $<ctxt>$)
679 { end_element(ELT_HEAD_DATE_TIME,
680 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
684 /* HEAD.TIME (Only for compatibility) */
685 head_time_sect : OPEN DELIM TAG_TIME opt_line_item
686 { if (compat_mode(C_HEAD_TIME)) {
687 $<ctxt>$ = compat_generate_head_time_start($1, $3, $4);
691 { if (compat_mode (C_HEAD_TIME)) {
692 compat_generate_head_time_end($<ctxt>5);
698 head_subm_sect : OPEN DELIM TAG_SUBM 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_SUBM,
704 GEDCOM_MAKE_XREF_PTR(val1, xr));
705 START(SUBM, $1, $<ctxt>$)
710 { end_element(ELT_HEAD_SUBM,
711 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
715 head_subn_sect : OPEN DELIM TAG_SUBN mand_pointer
716 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
718 if (xr == NULL) HANDLE_ERROR;
719 $<ctxt>$ = start_element(ELT_HEAD_SUBN,
721 GEDCOM_MAKE_XREF_PTR(val1, xr));
722 START(SUBN, $1, $<ctxt>$)
727 { end_element(ELT_HEAD_SUBN,
728 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
732 head_file_sect : OPEN DELIM TAG_FILE mand_line_item
733 { $<ctxt>$ = start_element(ELT_HEAD_FILE,
735 GEDCOM_MAKE_STRING(val1, $4));
736 START(FILE, $1, $<ctxt>$)
741 { end_element(ELT_HEAD_FILE, PARENT, $<ctxt>5,
742 GEDCOM_MAKE_NULL(val1));
746 head_copr_sect : OPEN DELIM TAG_COPR mand_line_item
747 { $<ctxt>$ = start_element(ELT_HEAD_COPR,
749 GEDCOM_MAKE_STRING(val1, $4));
750 START(COPR, $1, $<ctxt>$)
755 { end_element(ELT_HEAD_COPR, PARENT, $<ctxt>5,
756 GEDCOM_MAKE_NULL(val1));
760 head_gedc_sect : OPEN DELIM TAG_GEDC
761 { $<ctxt>$ = start_element(ELT_HEAD_GEDC,
762 PARENT, $1, $3, NULL,
763 GEDCOM_MAKE_NULL(val1));
764 START(GEDC, $1, $<ctxt>$)
767 { if (compat_mode(C_NO_GEDC_FORM) && ! CHK_COND(FORM))
768 compat_generate_gedcom_form($<ctxt>4);
775 { end_element(ELT_HEAD_GEDC, PARENT, $<ctxt>4,
776 GEDCOM_MAKE_NULL(val1));
780 head_gedc_subs : /* empty */
781 | head_gedc_subs head_gedc_sub
784 head_gedc_sub : head_gedc_vers_sect { OCCUR2(VERS, 1, 1) }
785 | head_gedc_form_sect { OCCUR2(FORM, 1, 1) }
788 head_gedc_vers_sect : OPEN DELIM TAG_VERS mand_line_item
789 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_VERS,
791 GEDCOM_MAKE_STRING(val1, $4));
792 START(VERS, $1, $<ctxt>$)
797 { end_element(ELT_HEAD_GEDC_VERS,
798 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
801 head_gedc_form_sect : OPEN DELIM TAG_FORM mand_line_item
802 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_FORM,
804 GEDCOM_MAKE_STRING(val1, $4));
805 START(FORM, $1, $<ctxt>$)
810 { end_element(ELT_HEAD_GEDC_FORM,
811 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
816 head_char_sect : OPEN DELIM TAG_CHAR mand_line_item
817 { /* Don't allow to continue if conversion context couldn't
819 if (open_conv_to_internal($4) == 0) HANDLE_ERROR;
820 $<ctxt>$ = start_element(ELT_HEAD_CHAR,
822 GEDCOM_MAKE_STRING(val1, $4));
823 START(CHAR, $1, $<ctxt>$)
828 { end_element(ELT_HEAD_CHAR, PARENT, $<ctxt>5,
829 GEDCOM_MAKE_NULL(val1));
833 head_char_subs : /* empty */
834 | head_char_subs head_char_sub
837 head_char_sub : head_char_vers_sect { OCCUR2(VERS, 0, 1) }
840 head_char_vers_sect : OPEN DELIM TAG_VERS mand_line_item
841 { $<ctxt>$ = start_element(ELT_HEAD_CHAR_VERS,
843 GEDCOM_MAKE_STRING(val1, $4));
844 START(VERS, $1, $<ctxt>$)
849 { end_element(ELT_HEAD_CHAR_VERS,
850 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
855 head_lang_sect : OPEN DELIM TAG_LANG mand_line_item
856 { $<ctxt>$ = start_element(ELT_HEAD_LANG,
858 GEDCOM_MAKE_STRING(val1, $4));
859 START(LANG, $1, $<ctxt>$)
864 { end_element(ELT_HEAD_LANG, PARENT, $<ctxt>5,
865 GEDCOM_MAKE_NULL(val1));
869 head_plac_sect : OPEN DELIM TAG_PLAC
870 { $<ctxt>$ = start_element(ELT_HEAD_PLAC,
871 PARENT, $1, $3, NULL,
872 GEDCOM_MAKE_NULL(val1));
873 START(PLAC, $1, $<ctxt>$)
878 { end_element(ELT_HEAD_PLAC, PARENT, $<ctxt>4,
879 GEDCOM_MAKE_NULL(val1));
883 head_plac_subs : /* empty */
884 | head_plac_subs head_plac_sub
887 head_plac_sub : head_plac_form_sect { OCCUR2(FORM, 1, 1) }
890 head_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
891 { $<ctxt>$ = start_element(ELT_HEAD_PLAC_FORM,
893 GEDCOM_MAKE_STRING(val1, $4));
894 START(FORM, $1, $<ctxt>$)
899 { end_element(ELT_HEAD_PLAC_FORM,
900 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
905 head_note_sect : OPEN DELIM TAG_NOTE mand_line_item
906 { $<ctxt>$ = start_element(ELT_HEAD_NOTE,
908 GEDCOM_MAKE_STRING(val1, $4));
909 reset_buffer(&concat_buffer);
910 safe_buf_append(&concat_buffer, $4);
911 START(NOTE, $1, $<ctxt>$)
916 { char* complete = get_buf_string(&concat_buffer);
917 end_element(ELT_HEAD_NOTE, PARENT, $<ctxt>5,
918 GEDCOM_MAKE_STRING(val1, complete));
922 head_note_subs : /* empty */
923 | head_note_subs head_note_sub
926 head_note_sub : continuation_sub /* 0:M */
930 /*********************************************************************/
932 /*********************************************************************/
933 /* Don't need callbacks here, there is no information... */
934 trlr_sect : OPEN DELIM TAG_TRLR CLOSE { }
937 /*********************************************************************/
938 /**** Family record ****/
939 /*********************************************************************/
940 fam_rec : OPEN DELIM POINTER DELIM TAG_FAM
941 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
943 if (xr == NULL) HANDLE_ERROR;
944 $<ctxt>$ = start_record(REC_FAM,
945 $1, GEDCOM_MAKE_XREF_PTR(val1, xr),
947 NULL, GEDCOM_MAKE_NULL(val2));
948 START(FAM, $1, $<ctxt>$) }
952 { end_record(REC_FAM, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
955 fam_subs : /* empty */
959 fam_sub : fam_event_struc_sub /* 0:M */
960 | fam_husb_sect { OCCUR2(HUSB, 0, 1) }
961 | fam_wife_sect { OCCUR2(WIFE, 0, 1) }
962 | fam_chil_sect /* 0:M */
963 | fam_nchi_sect { OCCUR2(NCHI, 0, 1) }
964 | fam_subm_sect /* 0:M */
965 | lds_spouse_seal_sub /* 0:M */
966 | source_cit_sub /* 0:M */
967 | multim_link_sub /* 0:M */
968 | note_struc_sub /* 0:M */
969 | ident_struc_sub /* 0:1 */
970 | change_date_sub /* 0:1 */
975 fam_husb_sect : OPEN DELIM TAG_HUSB mand_pointer
976 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
978 if (xr == NULL) HANDLE_ERROR;
979 $<ctxt>$ = start_element(ELT_FAM_HUSB,
981 GEDCOM_MAKE_XREF_PTR(val1, xr));
982 START(HUSB, $1, $<ctxt>$)
987 { end_element(ELT_FAM_HUSB, PARENT, $<ctxt>5,
988 GEDCOM_MAKE_NULL(val1));
993 fam_wife_sect : OPEN DELIM TAG_WIFE mand_pointer
994 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
996 if (xr == NULL) HANDLE_ERROR;
997 $<ctxt>$ = start_element(ELT_FAM_WIFE,
999 GEDCOM_MAKE_XREF_PTR(val1, xr));
1000 START(WIFE, $1, $<ctxt>$)
1005 { end_element(ELT_FAM_WIFE, PARENT, $<ctxt>5,
1006 GEDCOM_MAKE_NULL(val1));
1011 fam_chil_sect : OPEN DELIM TAG_CHIL mand_pointer
1012 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1014 if (xr == NULL) HANDLE_ERROR;
1015 $<ctxt>$ = start_element(ELT_FAM_CHIL,
1017 GEDCOM_MAKE_XREF_PTR(val1, xr));
1018 START(CHIL, $1, $<ctxt>$)
1023 { end_element(ELT_FAM_CHIL, PARENT, $<ctxt>5,
1024 GEDCOM_MAKE_NULL(val1));
1029 fam_nchi_sect : OPEN DELIM TAG_NCHI mand_line_item
1030 { $<ctxt>$ = start_element(ELT_FAM_NCHI,
1032 GEDCOM_MAKE_STRING(val1, $4));
1033 START(NCHI, $1, $<ctxt>$)
1038 { end_element(ELT_FAM_NCHI, PARENT, $<ctxt>5,
1039 GEDCOM_MAKE_NULL(val1));
1044 fam_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1045 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1047 if (xr == NULL) HANDLE_ERROR;
1048 $<ctxt>$ = start_element(ELT_FAM_SUBM,
1050 GEDCOM_MAKE_XREF_PTR(val1, xr));
1051 START(SUBM, $1, $<ctxt>$)
1056 { end_element(ELT_FAM_SUBM, PARENT, $<ctxt>5,
1057 GEDCOM_MAKE_NULL(val1));
1061 /*********************************************************************/
1062 /**** Individual record ****/
1063 /*********************************************************************/
1064 indiv_rec : OPEN DELIM POINTER DELIM TAG_INDI
1065 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1067 if (xr == NULL) HANDLE_ERROR;
1068 $<ctxt>$ = start_record(REC_INDI,
1069 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1070 NULL, GEDCOM_MAKE_NULL(val2));
1071 START(INDI, $1, $<ctxt>$) }
1075 { end_record(REC_INDI, $<ctxt>6, GEDCOM_MAKE_NULL(val1));
1076 if (compat_mode(C_NO_SLGC_FAMC))
1077 compat_generate_slgc_famc_fam();
1081 indi_subs : /* empty */
1082 | indi_subs indi_sub
1085 indi_sub : indi_resn_sect { OCCUR2(RESN, 0, 1) }
1086 | pers_name_struc_sub /* 0:M */
1087 | indi_sex_sect { OCCUR2(SEX, 0, 1) }
1088 | indiv_even_struc_sub /* 0:M */
1089 | indiv_attr_struc_sub /* 0:M */
1090 | lds_indiv_ord_sub /* 0:M */
1091 | chi_fam_link_sub /* 0:M */
1092 | spou_fam_link_sub /* 0:M */
1093 | indi_subm_sect /* 0:M */
1094 | assoc_struc_sub /* 0:M */
1095 | indi_alia_sect /* 0:M */
1096 | indi_anci_sect /* 0:M */
1097 | indi_desi_sect /* 0:M */
1098 | source_cit_sub /* 0:M */
1099 | multim_link_sub /* 0:M */
1100 | note_struc_sub /* 0:M */
1101 | indi_rfn_sect { OCCUR2(RFN, 0, 1) }
1102 | indi_afn_sect /* 0:M */
1103 | ident_struc_sub /* 0:1 */
1104 | change_date_sub /* 0:1 */
1105 | indi_addr_sect { if (!compat_mode(C_INDI_ADDR))
1106 INVALID_TAG("ADDR");
1112 indi_resn_sect : OPEN DELIM TAG_RESN mand_line_item
1113 { $<ctxt>$ = start_element(ELT_INDI_RESN,
1115 GEDCOM_MAKE_STRING(val1, $4));
1116 START(RESN, $1, $<ctxt>$)
1121 { end_element(ELT_INDI_RESN, PARENT, $<ctxt>5,
1122 GEDCOM_MAKE_NULL(val1));
1127 indi_sex_sect : OPEN DELIM TAG_SEX mand_line_item
1128 { $<ctxt>$ = start_element(ELT_INDI_SEX,
1130 GEDCOM_MAKE_STRING(val1, $4));
1131 START(SEX, $1, $<ctxt>$)
1136 { end_element(ELT_INDI_SEX, PARENT, $<ctxt>5,
1137 GEDCOM_MAKE_NULL(val1));
1142 indi_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1143 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1145 if (xr == NULL) HANDLE_ERROR;
1146 $<ctxt>$ = start_element(ELT_INDI_SUBM,
1148 GEDCOM_MAKE_XREF_PTR(val1, xr));
1149 START(SUBM, $1, $<ctxt>$)
1154 { end_element(ELT_INDI_SUBM, PARENT, $<ctxt>5,
1155 GEDCOM_MAKE_NULL(val1));
1160 indi_alia_sect : OPEN DELIM TAG_ALIA mand_pointer
1161 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1163 if (xr == NULL) HANDLE_ERROR;
1164 $<ctxt>$ = start_element(ELT_INDI_ALIA,
1166 GEDCOM_MAKE_XREF_PTR(val1, xr));
1167 START(ALIA, $1, $<ctxt>$)
1172 { end_element(ELT_INDI_ALIA, PARENT, $<ctxt>5,
1173 GEDCOM_MAKE_NULL(val1));
1178 indi_anci_sect : OPEN DELIM TAG_ANCI mand_pointer
1179 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1181 if (xr == NULL) HANDLE_ERROR;
1182 $<ctxt>$ = start_element(ELT_INDI_ANCI,
1184 GEDCOM_MAKE_XREF_PTR(val1, xr));
1185 START(ANCI, $1, $<ctxt>$)
1190 { end_element(ELT_INDI_ANCI, PARENT, $<ctxt>5,
1191 GEDCOM_MAKE_NULL(val1));
1196 indi_desi_sect : OPEN DELIM TAG_DESI mand_pointer
1197 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1199 if (xr == NULL) HANDLE_ERROR;
1200 $<ctxt>$ = start_element(ELT_INDI_DESI,
1202 GEDCOM_MAKE_XREF_PTR(val1, xr));
1203 START(DESI, $1, $<ctxt>$)
1208 { end_element(ELT_INDI_DESI, PARENT, $<ctxt>5,
1209 GEDCOM_MAKE_NULL(val1));
1214 indi_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1215 { $<ctxt>$ = start_element(ELT_INDI_RFN,
1217 GEDCOM_MAKE_STRING(val1, $4));
1218 START(RFN, $1, $<ctxt>$)
1223 { end_element(ELT_INDI_RFN, PARENT, $<ctxt>5,
1224 GEDCOM_MAKE_NULL(val1));
1229 indi_afn_sect : OPEN DELIM TAG_AFN mand_line_item
1230 { $<ctxt>$ = start_element(ELT_INDI_AFN,
1232 GEDCOM_MAKE_STRING(val1, $4));
1233 START(AFN, $1, $<ctxt>$)
1238 { end_element(ELT_INDI_AFN, PARENT, $<ctxt>5,
1239 GEDCOM_MAKE_NULL(val1));
1243 /* INDI.ADDR (Only for compatibility) */
1244 indi_addr_sect : OPEN DELIM TAG_ADDR opt_line_item
1245 { if (compat_mode(C_INDI_ADDR)) {
1246 Gedcom_ctxt par = compat_generate_resi_start(PARENT);
1247 START(RESI, $1, par);
1249 = start_element(ELT_SUB_ADDR,
1250 par, $1 + 1, $3, $4,
1251 GEDCOM_MAKE_NULL_OR_STRING(val2, $4));
1252 reset_buffer(&concat_buffer);
1253 safe_buf_append(&concat_buffer, $4);
1254 START(ADDR, $1 + 1, $<ctxt>$);
1256 else { START(ADDR, $1, NULL) }
1261 { if (compat_mode(C_INDI_ADDR)) {
1262 Gedcom_ctxt par = PARENT;
1263 char* complete = get_buf_string(&concat_buffer);
1264 end_element(ELT_SUB_ADDR, par, $<ctxt>5,
1265 GEDCOM_MAKE_STRING(val1, complete));
1267 compat_generate_resi_end(PARENT, par);
1272 ftree_addr_subs : /* empty */
1273 | ftree_addr_subs ftree_addr_sub
1276 ftree_addr_sub : continuation_sub
1277 | ftree_addr_phon_sect
1281 ftree_addr_phon_sect : OPEN DELIM TAG_PHON mand_line_item
1283 = start_element(ELT_SUB_PHON,
1284 GRANDPARENT(1), $1, $3, $4,
1285 GEDCOM_MAKE_STRING(val1, $4));
1286 START(PHON, $1, $<ctxt>$)
1291 { end_element(ELT_SUB_PHON, GRANDPARENT(1),
1292 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1296 /*********************************************************************/
1297 /**** Multimedia record ****/
1298 /*********************************************************************/
1299 multim_rec : OPEN DELIM POINTER DELIM TAG_OBJE
1300 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1302 if (xr == NULL) HANDLE_ERROR;
1303 $<ctxt>$ = start_record(REC_OBJE,
1304 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1305 NULL, GEDCOM_MAKE_NULL(val2));
1306 START(OBJE, $1, $<ctxt>$) }
1308 { CHECK2(FORM, BLOB) }
1310 { end_record(REC_OBJE, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1313 obje_subs : /* empty */
1314 | obje_subs obje_sub
1317 obje_sub : obje_form_sect { OCCUR2(FORM, 1, 1) }
1318 | obje_titl_sect { OCCUR2(TITL, 0, 1) }
1319 | note_struc_sub /* 0:M */
1320 | obje_blob_sect { OCCUR2(BLOB, 1, 1) }
1321 | obje_obje_sect { OCCUR2(OBJE, 0, 1) }
1322 | ident_struc_sub /* 0:1 */
1323 | change_date_sub /* 0:1 */
1328 obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
1329 { $<ctxt>$ = start_element(ELT_OBJE_FORM,
1331 GEDCOM_MAKE_STRING(val1, $4));
1332 START(FORM, $1, $<ctxt>$)
1337 { end_element(ELT_OBJE_FORM, PARENT, $<ctxt>5,
1338 GEDCOM_MAKE_NULL(val1));
1343 obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1344 { $<ctxt>$ = start_element(ELT_OBJE_TITL,
1346 GEDCOM_MAKE_STRING(val1, $4));
1347 START(TITL, $1, $<ctxt>$)
1352 { end_element(ELT_OBJE_TITL, PARENT, $<ctxt>5,
1353 GEDCOM_MAKE_NULL(val1));
1358 obje_blob_sect : OPEN DELIM TAG_BLOB
1359 { $<ctxt>$ = start_element(ELT_OBJE_BLOB,
1360 PARENT, $1, $3, NULL,
1361 GEDCOM_MAKE_NULL(val1));
1362 reset_buffer(&concat_buffer);
1363 START(BLOB, $1, $<ctxt>$)
1368 { char* complete = get_buf_string(&concat_buffer);
1369 end_element(ELT_OBJE_BLOB, PARENT, $<ctxt>4,
1370 GEDCOM_MAKE_STRING(val1, complete));
1374 obje_blob_subs : /* empty */
1375 | obje_blob_subs obje_blob_sub
1378 obje_blob_sub : obje_blob_cont_sect { OCCUR1(CONT, 1) }
1382 obje_blob_cont_sect : OPEN DELIM TAG_CONT mand_line_item
1383 { $<ctxt>$ = start_element(ELT_OBJE_BLOB_CONT,
1385 GEDCOM_MAKE_STRING(val1, $4));
1386 safe_buf_append(&concat_buffer, $4);
1387 START(CONT, $1, $<ctxt>$)
1392 { end_element(ELT_OBJE_BLOB_CONT, PARENT,
1393 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1398 obje_obje_sect : OPEN DELIM TAG_OBJE mand_pointer
1399 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1401 if (xr == NULL) HANDLE_ERROR;
1402 $<ctxt>$ = start_element(ELT_OBJE_OBJE,
1404 GEDCOM_MAKE_XREF_PTR(val1, xr));
1405 START(OBJE, $1, $<ctxt>$)
1410 { end_element(ELT_OBJE_OBJE, PARENT, $<ctxt>5,
1411 GEDCOM_MAKE_NULL(val1));
1415 /*********************************************************************/
1416 /**** Note record ****/
1417 /*********************************************************************/
1418 note_rec : OPEN DELIM POINTER DELIM TAG_NOTE note_line_item
1419 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1421 if (xr == NULL) HANDLE_ERROR;
1422 $<ctxt>$ = start_record(REC_NOTE,
1423 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1424 $6, GEDCOM_MAKE_STRING(val2, $6));
1425 reset_buffer(&concat_buffer);
1426 safe_buf_append(&concat_buffer, $6);
1427 START(NOTE, $1, $<ctxt>$) }
1431 { char* complete = get_buf_string(&concat_buffer);
1432 end_record(REC_NOTE, $<ctxt>7,
1433 GEDCOM_MAKE_STRING(val1, complete)); }
1436 note_line_item : /* empty */
1437 { if (!compat_mode(C_NOTE_NO_VALUE)) {
1438 gedcom_error(_("Missing value")); YYERROR;
1441 $$ = VALUE_IF_MISSING;
1445 { gedcom_debug_print("==Val: %s==", $2);
1449 note_subs : /* empty */
1450 | note_subs note_sub
1453 note_sub : continuation_sub /* 0:M */
1454 | source_cit_sub /* 0:M */
1455 | ident_struc_sub /* 0:1 */
1456 | change_date_sub /* 0:1 */
1457 | note_note_sect { if (!compat_mode(C_NOTE_NOTE))
1458 INVALID_TAG("NOTE");
1463 /* Same actions as cont_sect, for compatibility */
1464 note_note_sect : OPEN DELIM TAG_NOTE opt_line_item
1465 { $3.string = "CONT";
1466 $3.value = TAG_CONT;
1467 $<ctxt>$ = start_element(ELT_SUB_CONT,
1469 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
1470 SAFE_BUF_ADDCHAR(&concat_buffer, '\n');
1471 if (GEDCOM_IS_STRING(&val1))
1472 safe_buf_append(&concat_buffer, $4);
1473 START(CONT, $1, $<ctxt>$)
1478 { end_element(ELT_SUB_CONT, PARENT, $<ctxt>5,
1479 GEDCOM_MAKE_NULL(val1));
1483 /*********************************************************************/
1484 /**** Repository record ****/
1485 /*********************************************************************/
1486 repos_rec : OPEN DELIM POINTER DELIM TAG_REPO
1487 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1489 if (xr == NULL) HANDLE_ERROR;
1490 $<ctxt>$ = start_record(REC_REPO,
1491 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1492 NULL, GEDCOM_MAKE_NULL(val2));
1493 START(REPO, $1, $<ctxt>$) }
1497 { end_record(REC_REPO, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1500 repo_subs : /* empty */
1501 | repo_subs repo_sub
1504 repo_sub : repo_name_sect { OCCUR2(NAME, 0, 1) }
1505 | addr_struc_sub /* 0:1 */
1506 | note_struc_sub /* 0:M */
1507 | ident_struc_sub /* 0:1 */
1508 | change_date_sub /* 0:1 */
1513 repo_name_sect : OPEN DELIM TAG_NAME mand_line_item
1514 { $<ctxt>$ = start_element(ELT_REPO_NAME,
1516 GEDCOM_MAKE_STRING(val1, $4));
1517 START(NAME, $1, $<ctxt>$)
1522 { end_element(ELT_REPO_NAME, PARENT, $<ctxt>5,
1523 GEDCOM_MAKE_NULL(val1));
1527 /*********************************************************************/
1528 /**** Source record ****/
1529 /*********************************************************************/
1530 source_rec : OPEN DELIM POINTER DELIM TAG_SOUR
1531 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1533 if (xr == NULL) HANDLE_ERROR;
1534 $<ctxt>$ = start_record(REC_SOUR,
1535 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1536 NULL, GEDCOM_MAKE_NULL(val2));
1537 START(SOUR, $1, $<ctxt>$) }
1541 { end_record(REC_SOUR, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1544 sour_subs : /* empty */
1545 | sour_subs sour_sub
1548 sour_sub : sour_data_sect { OCCUR2(DATA, 0, 1) }
1549 | sour_auth_sect { OCCUR2(AUTH, 0, 1) }
1550 | sour_titl_sect { OCCUR2(TITL, 0, 1) }
1551 | sour_abbr_sect { OCCUR2(ABBR, 0, 1) }
1552 | sour_publ_sect { OCCUR2(PUBL, 0, 1) }
1553 | sour_text_sect { OCCUR2(TEXT, 0, 1) }
1554 | sour_type_sect { if (!compat_mode(C_NONSTD_SOUR_TAGS))
1555 INVALID_TAG("TYPE");
1556 OCCUR2(TYPE, 0, 1) }
1557 | sour_file_sect { if (!compat_mode(C_NONSTD_SOUR_TAGS))
1558 INVALID_TAG("FILE");
1559 OCCUR2(FILE, 0, 1) }
1560 | sour_plac_sect { if (!compat_mode(C_NONSTD_SOUR_TAGS))
1561 INVALID_TAG("PLAC");
1562 OCCUR2(PLAC, 0, 1) }
1563 | sour_date_sect { if (!compat_mode(C_NONSTD_SOUR_TAGS))
1564 INVALID_TAG("DATE");
1565 OCCUR2(DATE, 0, 1) }
1566 | sour_medi_sect { if (!compat_mode(C_NONSTD_SOUR_TAGS))
1567 INVALID_TAG("MEDI");
1568 OCCUR2(MEDI, 0, 1) }
1569 | sour_page_sect { if (!compat_mode(C_NONSTD_SOUR_TAGS))
1570 INVALID_TAG("PAGE");
1571 OCCUR2(PAGE, 0, 1) }
1572 | source_repos_cit_sub /* 0:1 */
1573 | multim_link_sub /* 0:M */
1574 | note_struc_sub /* 0:M */
1575 | ident_struc_sub /* 0:1 */
1576 | change_date_sub /* 0:1 */
1581 sour_data_sect : OPEN DELIM TAG_DATA
1582 { $<ctxt>$ = start_element(ELT_SOUR_DATA,
1583 PARENT, $1, $3, NULL,
1584 GEDCOM_MAKE_NULL(val1));
1585 START(DATA, $1, $<ctxt>$)
1590 { end_element(ELT_SOUR_DATA, PARENT, $<ctxt>4,
1591 GEDCOM_MAKE_NULL(val1));
1595 sour_data_subs : /* empty */
1596 | sour_data_subs sour_data_sub
1599 sour_data_sub : sour_data_even_sect /* 0:M */
1600 | sour_data_agnc_sect { OCCUR2(AGNC, 0, 1) }
1601 | note_struc_sub /* 0:M */
1605 sour_data_even_sect : OPEN DELIM TAG_EVEN mand_line_item
1606 { $<ctxt>$ = start_element(ELT_SOUR_DATA_EVEN,
1608 GEDCOM_MAKE_STRING(val1, $4));
1609 START(EVEN, $1, $<ctxt>$)
1614 { end_element(ELT_SOUR_DATA_EVEN, PARENT,
1615 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1619 sour_data_even_subs : /* empty */
1620 | sour_data_even_subs sour_data_even_sub
1623 sour_data_even_sub : sour_data_even_date_sect { OCCUR2(DATE, 0, 1) }
1624 | sour_data_even_plac_sect { OCCUR2(PLAC, 0, 1) }
1628 sour_data_even_date_sect : OPEN DELIM TAG_DATE mand_line_item
1629 { struct date_value dv = gedcom_parse_date($4);
1631 = start_element(ELT_SOUR_DATA_EVEN_DATE,
1633 GEDCOM_MAKE_DATE(val1, dv));
1634 START(DATE, $1, $<ctxt>$)
1639 { end_element(ELT_SOUR_DATA_EVEN_DATE, PARENT,
1640 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1644 sour_data_even_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
1646 = start_element(ELT_SOUR_DATA_EVEN_PLAC,
1648 GEDCOM_MAKE_STRING(val1, $4));
1649 START(PLAC, $1, $<ctxt>$)
1654 { end_element(ELT_SOUR_DATA_EVEN_PLAC, PARENT,
1655 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1659 sour_data_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
1660 { $<ctxt>$ = start_element(ELT_SOUR_DATA_AGNC,
1662 GEDCOM_MAKE_STRING(val1, $4));
1663 START(AGNC, $1, $<ctxt>$)
1668 { end_element(ELT_SOUR_DATA_AGNC, PARENT,
1669 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1674 sour_auth_sect : OPEN DELIM TAG_AUTH mand_line_item
1675 { $<ctxt>$ = start_element(ELT_SOUR_AUTH,
1677 GEDCOM_MAKE_STRING(val1, $4));
1678 reset_buffer(&concat_buffer);
1679 safe_buf_append(&concat_buffer, $4);
1680 START(AUTH, $1, $<ctxt>$)
1685 { char* complete = get_buf_string(&concat_buffer);
1686 end_element(ELT_SOUR_AUTH, PARENT, $<ctxt>5,
1687 GEDCOM_MAKE_STRING(val1, complete));
1691 sour_auth_subs : /* empty */
1692 | sour_auth_subs sour_auth_sub
1695 sour_auth_sub : continuation_sub /* 0:M */
1700 sour_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1701 { $<ctxt>$ = start_element(ELT_SOUR_TITL,
1703 GEDCOM_MAKE_STRING(val1, $4));
1704 reset_buffer(&concat_buffer);
1705 safe_buf_append(&concat_buffer, $4);
1706 START(TITL, $1, $<ctxt>$)
1711 { char* complete = get_buf_string(&concat_buffer);
1712 end_element(ELT_SOUR_TITL, PARENT, $<ctxt>5,
1713 GEDCOM_MAKE_STRING(val1, complete));
1717 sour_titl_subs : /* empty */
1718 | sour_titl_subs sour_titl_sub
1721 sour_titl_sub : continuation_sub /* 0:M */
1726 sour_abbr_sect : OPEN DELIM TAG_ABBR mand_line_item
1727 { $<ctxt>$ = start_element(ELT_SOUR_ABBR,
1729 GEDCOM_MAKE_STRING(val1, $4));
1730 START(ABBR, $1, $<ctxt>$)
1735 { end_element(ELT_SOUR_ABBR, PARENT, $<ctxt>5,
1736 GEDCOM_MAKE_NULL(val1));
1741 sour_publ_sect : OPEN DELIM TAG_PUBL mand_line_item
1742 { $<ctxt>$ = start_element(ELT_SOUR_PUBL,
1744 GEDCOM_MAKE_STRING(val1, $4));
1745 reset_buffer(&concat_buffer);
1746 safe_buf_append(&concat_buffer, $4);
1747 START(PUBL, $1, $<ctxt>$)
1752 { char* complete = get_buf_string(&concat_buffer);
1753 end_element(ELT_SOUR_PUBL, PARENT, $<ctxt>5,
1754 GEDCOM_MAKE_STRING(val1, complete));
1758 sour_publ_subs : /* empty */
1759 | sour_publ_subs sour_publ_sub
1762 sour_publ_sub : continuation_sub /* 0:M */
1767 sour_text_sect : OPEN DELIM TAG_TEXT mand_line_item
1768 { $<ctxt>$ = start_element(ELT_SOUR_TEXT,
1770 GEDCOM_MAKE_STRING(val1, $4));
1771 reset_buffer(&concat_buffer);
1772 safe_buf_append(&concat_buffer, $4);
1773 START(TEXT, $1, $<ctxt>$)
1778 { char* complete = get_buf_string(&concat_buffer);
1779 end_element(ELT_SOUR_TEXT, PARENT, $<ctxt>5,
1780 GEDCOM_MAKE_STRING(val1, complete));
1784 sour_text_subs : /* empty */
1785 | sour_text_subs sour_text_sub
1788 sour_text_sub : continuation_sub /* 0:M */
1792 /* Only for compatibility */
1793 sour_type_sect : OPEN DELIM TAG_TYPE opt_line_item
1794 { if (compat_mode(C_NONSTD_SOUR_TAGS)) {
1796 compat_generate_nonstd_sour_start(PARENT, $1, $3, $4,
1801 { if (compat_mode(C_NONSTD_SOUR_TAGS))
1802 compat_generate_nonstd_sour_end(PARENT, $<ctxt>5);
1806 /* Only for compatibility */
1807 sour_file_sect : OPEN DELIM TAG_FILE opt_line_item
1808 { if (compat_mode(C_NONSTD_SOUR_TAGS)) {
1810 compat_generate_nonstd_sour_start(PARENT, $1, $3, $4,
1815 { if (compat_mode(C_NONSTD_SOUR_TAGS))
1816 compat_generate_nonstd_sour_end(PARENT, $<ctxt>5);
1820 /* Only for compatibility */
1821 sour_plac_sect : OPEN DELIM TAG_PLAC opt_line_item
1822 { if (compat_mode(C_NONSTD_SOUR_TAGS)) {
1824 compat_generate_nonstd_sour_start(PARENT, $1, $3, $4,
1829 { if (compat_mode(C_NONSTD_SOUR_TAGS))
1830 compat_generate_nonstd_sour_end(PARENT, $<ctxt>5);
1834 /* Only for compatibility */
1835 sour_date_sect : OPEN DELIM TAG_DATE opt_line_item
1836 { if (compat_mode(C_NONSTD_SOUR_TAGS)) {
1838 compat_generate_nonstd_sour_start(PARENT, $1, $3, $4,
1843 { if (compat_mode(C_NONSTD_SOUR_TAGS))
1844 compat_generate_nonstd_sour_end(PARENT, $<ctxt>5);
1848 /* Only for compatibility */
1849 sour_medi_sect : OPEN DELIM TAG_MEDI opt_line_item
1850 { if (compat_mode(C_NONSTD_SOUR_TAGS)) {
1852 compat_generate_nonstd_sour_start(PARENT, $1, $3, $4,
1857 { if (compat_mode(C_NONSTD_SOUR_TAGS))
1858 compat_generate_nonstd_sour_end(PARENT, $<ctxt>5);
1862 /* Only for compatibility */
1863 sour_page_sect : OPEN DELIM TAG_PAGE opt_line_item
1864 { if (compat_mode(C_NONSTD_SOUR_TAGS)) {
1866 compat_generate_nonstd_sour_start(PARENT, $1, $3, $4,
1871 { if (compat_mode(C_NONSTD_SOUR_TAGS))
1872 compat_generate_nonstd_sour_end(PARENT, $<ctxt>5);
1876 /*********************************************************************/
1877 /**** Submission record ****/
1878 /*********************************************************************/
1879 submis_rec : OPEN DELIM POINTER DELIM TAG_SUBN
1880 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1882 if (xr == NULL) HANDLE_ERROR;
1883 $<ctxt>$ = start_record(REC_SUBN,
1884 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1885 NULL, GEDCOM_MAKE_NULL(val2));
1886 START(SUBN, $1, $<ctxt>$) }
1890 { end_record(REC_SUBN, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1893 subn_subs : /* empty */
1894 | subn_subs subn_sub
1897 subn_sub : subn_subm_sect { OCCUR2(SUBM, 0, 1) }
1898 | subn_famf_sect { OCCUR2(FAMF, 0, 1) }
1899 | subn_temp_sect { OCCUR2(TEMP, 0, 1) }
1900 | subn_ance_sect { OCCUR2(ANCE, 0, 1) }
1901 | subn_desc_sect { OCCUR2(DESC, 0, 1) }
1902 | subn_ordi_sect { OCCUR2(ORDI, 0, 1) }
1903 | subn_rin_sect { OCCUR2(RIN, 0, 1) }
1908 subn_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1909 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1911 if (xr == NULL) HANDLE_ERROR;
1912 $<ctxt>$ = start_element(ELT_SUBN_SUBM,
1914 GEDCOM_MAKE_XREF_PTR(val1, xr));
1915 START(SUBM, $1, $<ctxt>$)
1920 { end_element(ELT_SUBN_SUBM, PARENT, $<ctxt>5,
1921 GEDCOM_MAKE_NULL(val1));
1926 subn_famf_sect : OPEN DELIM TAG_FAMF mand_line_item
1927 { $<ctxt>$ = start_element(ELT_SUBN_FAMF,
1929 GEDCOM_MAKE_STRING(val1, $4));
1930 START(FAMF, $1, $<ctxt>$)
1935 { end_element(ELT_SUBN_FAMF, PARENT, $<ctxt>5,
1936 GEDCOM_MAKE_NULL(val1));
1941 subn_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
1942 { $<ctxt>$ = start_element(ELT_SUBN_TEMP,
1944 GEDCOM_MAKE_STRING(val1, $4));
1945 START(TEMP, $1, $<ctxt>$)
1950 { end_element(ELT_SUBN_TEMP, PARENT, $<ctxt>5,
1951 GEDCOM_MAKE_NULL(val1));
1956 subn_ance_sect : OPEN DELIM TAG_ANCE mand_line_item
1957 { $<ctxt>$ = start_element(ELT_SUBN_ANCE,
1959 GEDCOM_MAKE_STRING(val1, $4));
1960 START(ANCE, $1, $<ctxt>$)
1965 { end_element(ELT_SUBN_ANCE, PARENT, $<ctxt>5,
1966 GEDCOM_MAKE_NULL(val1));
1971 subn_desc_sect : OPEN DELIM TAG_DESC mand_line_item
1972 { $<ctxt>$ = start_element(ELT_SUBN_DESC,
1974 GEDCOM_MAKE_STRING(val1, $4));
1975 START(DESC, $1, $<ctxt>$)
1980 { end_element(ELT_SUBN_DESC, PARENT, $<ctxt>5,
1981 GEDCOM_MAKE_NULL(val1));
1986 subn_ordi_sect : OPEN DELIM TAG_ORDI mand_line_item
1987 { $<ctxt>$ = start_element(ELT_SUBN_ORDI,
1989 GEDCOM_MAKE_STRING(val1, $4));
1990 START(ORDI, $1, $<ctxt>$)
1995 { end_element(ELT_SUBN_ORDI, PARENT, $<ctxt>5,
1996 GEDCOM_MAKE_NULL(val1));
2001 subn_rin_sect : OPEN DELIM TAG_RIN mand_line_item
2002 { $<ctxt>$ = start_element(ELT_SUBN_RIN,
2004 GEDCOM_MAKE_STRING(val1, $4));
2005 START(RIN, $1, $<ctxt>$)
2010 { end_element(ELT_SUBN_RIN, PARENT, $<ctxt>5,
2011 GEDCOM_MAKE_NULL(val1));
2015 /*********************************************************************/
2016 /**** Submitter record ****/
2017 /*********************************************************************/
2018 submit_rec : OPEN DELIM POINTER DELIM TAG_SUBM
2019 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
2021 if (xr == NULL) HANDLE_ERROR;
2022 $<ctxt>$ = start_record(REC_SUBM,
2023 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
2024 NULL, GEDCOM_MAKE_NULL(val2));
2025 START(SUBM, $1, $<ctxt>$) }
2029 { end_record(REC_SUBM, $<ctxt>6, GEDCOM_MAKE_NULL(val1));
2030 if (compat_mode(C_SUBM_CTRY))
2031 compat_free_ctry_parent_context();
2035 subm_subs : /* empty */
2036 | subm_subs subm_sub
2039 subm_sub : subm_name_sect { OCCUR2(NAME, 1, 1) }
2040 | addr_struc_sub /* 0:1 */
2041 | multim_link_sub /* 0:M */
2042 | subm_lang_sect { OCCUR2(LANG, 0, 3) }
2043 | subm_rfn_sect { OCCUR2(RFN, 0, 1) }
2044 | subm_rin_sect { OCCUR2(RIN, 0, 1) }
2045 | change_date_sub /* 0:1 */
2046 | subm_ctry_sect { if (!compat_mode(C_SUBM_CTRY))
2047 INVALID_TAG("CTRY");
2048 OCCUR2(CTRY, 0, 1) }
2053 subm_name_sect : OPEN DELIM TAG_NAME mand_line_item
2054 { $<ctxt>$ = start_element(ELT_SUBM_NAME,
2056 GEDCOM_MAKE_STRING(val1, $4));
2057 START(NAME, $1, $<ctxt>$)
2062 { end_element(ELT_SUBM_NAME, PARENT, $<ctxt>5,
2063 GEDCOM_MAKE_NULL(val1));
2068 subm_lang_sect : OPEN DELIM TAG_LANG mand_line_item
2069 { $<ctxt>$ = start_element(ELT_SUBM_LANG,
2071 GEDCOM_MAKE_STRING(val1, $4));
2072 START(LANG, $1, $<ctxt>$)
2077 { end_element(ELT_SUBM_LANG, PARENT, $<ctxt>5,
2078 GEDCOM_MAKE_NULL(val1));
2083 subm_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
2084 { $<ctxt>$ = start_element(ELT_SUBM_RFN,
2086 GEDCOM_MAKE_STRING(val1, $4));
2087 START(RFN, $1, $<ctxt>$)
2092 { end_element(ELT_SUBM_RFN, PARENT, $<ctxt>5,
2093 GEDCOM_MAKE_NULL(val1));
2098 subm_rin_sect : OPEN DELIM TAG_RIN mand_line_item
2099 { $<ctxt>$ = start_element(ELT_SUBM_RIN,
2101 GEDCOM_MAKE_STRING(val1, $4));
2102 START(RIN, $1, $<ctxt>$)
2107 { end_element(ELT_SUBM_RIN, PARENT, $<ctxt>5,
2108 GEDCOM_MAKE_NULL(val1));
2112 /* SUBM.CTRY (Only for compatibility) */
2113 subm_ctry_sect : OPEN DELIM TAG_CTRY opt_line_item
2114 { if (compat_mode(C_SUBM_CTRY)) {
2115 $<ctxt>$ = compat_generate_addr_ctry_start($1, $3, $4);
2119 { if (compat_mode (C_SUBM_CTRY)) {
2120 compat_generate_addr_ctry_end($<ctxt>5);
2125 /*********************************************************************/
2126 /**** Substructures ****/
2127 /*********************************************************************/
2129 /* ADDRESS STRUCTURE */
2130 addr_struc_sub : addr_sect { OCCUR2(ADDR, 0, 1) }
2131 | phon_sect { OCCUR2(PHON, 0, 3) }
2134 addr_sect : OPEN DELIM TAG_ADDR mand_line_item
2135 { $<ctxt>$ = start_element(ELT_SUB_ADDR,
2137 GEDCOM_MAKE_STRING(val1, $4));
2138 reset_buffer(&concat_buffer);
2139 safe_buf_append(&concat_buffer, $4);
2140 START(ADDR, $1, $<ctxt>$);
2141 if (compat_mode(C_SUBM_CTRY))
2142 compat_save_ctry_parent_context($<ctxt>$);
2147 { char* complete = get_buf_string(&concat_buffer);
2148 end_element(ELT_SUB_ADDR, PARENT, $<ctxt>5,
2149 GEDCOM_MAKE_STRING(val1, complete));
2153 addr_subs : /* empty */
2154 | addr_subs addr_sub
2157 addr_sub : addr_cont_sect /* 0:M */
2158 | addr_adr1_sect { OCCUR2(ADR1, 0, 1) }
2159 | addr_adr2_sect { OCCUR2(ADR2, 0, 1) }
2160 | addr_city_sect { OCCUR2(CITY, 0, 1) }
2161 | addr_stae_sect { OCCUR2(STAE, 0, 1) }
2162 | addr_post_sect { OCCUR2(POST, 0, 1) }
2163 | addr_ctry_sect { OCCUR2(CTRY, 0, 1) }
2167 addr_cont_sect : OPEN DELIM TAG_CONT mand_line_item
2168 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CONT,
2170 GEDCOM_MAKE_STRING(val1, $4));
2171 SAFE_BUF_ADDCHAR(&concat_buffer, '\n');
2172 safe_buf_append(&concat_buffer, $4);
2173 START(CONT, $1, $<ctxt>$)
2178 { end_element(ELT_SUB_ADDR_CONT, PARENT, $<ctxt>5,
2179 GEDCOM_MAKE_NULL(val1));
2182 addr_adr1_sect : OPEN DELIM TAG_ADR1 mand_line_item
2183 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR1,
2185 GEDCOM_MAKE_STRING(val1, $4));
2186 START(ADR1, $1, $<ctxt>$)
2191 { end_element(ELT_SUB_ADDR_ADR1, PARENT, $<ctxt>5,
2192 GEDCOM_MAKE_NULL(val1));
2195 addr_adr2_sect : OPEN DELIM TAG_ADR2 mand_line_item
2196 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR2,
2198 GEDCOM_MAKE_STRING(val1, $4));
2199 START(ADR2, $1, $<ctxt>$)
2204 { end_element(ELT_SUB_ADDR_ADR2, PARENT, $<ctxt>5,
2205 GEDCOM_MAKE_NULL(val1));
2208 addr_city_sect : OPEN DELIM TAG_CITY mand_line_item
2209 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CITY,
2211 GEDCOM_MAKE_STRING(val1, $4));
2212 START(CITY, $1, $<ctxt>$)
2217 { end_element(ELT_SUB_ADDR_CITY, PARENT, $<ctxt>5,
2218 GEDCOM_MAKE_NULL(val1));
2221 addr_stae_sect : OPEN DELIM TAG_STAE mand_line_item
2222 { $<ctxt>$ = start_element(ELT_SUB_ADDR_STAE,
2224 GEDCOM_MAKE_STRING(val1, $4));
2225 START(STAE, $1, $<ctxt>$)
2230 { end_element(ELT_SUB_ADDR_STAE, PARENT, $<ctxt>5,
2231 GEDCOM_MAKE_NULL(val1));
2234 addr_post_sect : OPEN DELIM TAG_POST mand_line_item
2235 { $<ctxt>$ = start_element(ELT_SUB_ADDR_POST,
2237 GEDCOM_MAKE_STRING(val1, $4));
2238 START(POST, $1, $<ctxt>$)
2243 { end_element(ELT_SUB_ADDR_POST, PARENT, $<ctxt>5,
2244 GEDCOM_MAKE_NULL(val1));
2247 addr_ctry_sect : OPEN DELIM TAG_CTRY mand_line_item
2248 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CTRY,
2250 GEDCOM_MAKE_STRING(val1, $4));
2251 START(CTRY, $1, $<ctxt>$)
2256 { end_element(ELT_SUB_ADDR_CTRY, PARENT, $<ctxt>5,
2257 GEDCOM_MAKE_NULL(val1));
2261 phon_sect : OPEN DELIM TAG_PHON mand_line_item
2262 { $<ctxt>$ = start_element(ELT_SUB_PHON,
2264 GEDCOM_MAKE_STRING(val1, $4));
2265 START(PHON, $1, $<ctxt>$)
2270 { end_element(ELT_SUB_PHON, PARENT, $<ctxt>5,
2271 GEDCOM_MAKE_NULL(val1));
2275 /* ASSOCIATION STRUCTURE */
2276 assoc_struc_sub : asso_sect /* 0:M */
2279 asso_sect : OPEN DELIM TAG_ASSO mand_pointer
2280 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2282 if (xr == NULL) HANDLE_ERROR;
2283 $<ctxt>$ = start_element(ELT_SUB_ASSO,
2285 GEDCOM_MAKE_XREF_PTR(val1, xr));
2286 START(ASSO, $1, $<ctxt>$)
2289 { CHECK2(TYPE,RELA) }
2291 { end_element(ELT_SUB_ASSO, PARENT, $<ctxt>5,
2292 GEDCOM_MAKE_NULL(val1));
2296 asso_subs : /* empty */
2297 | asso_type_sect { OCCUR2(TYPE, 1, 1) }
2298 | asso_rela_sect { OCCUR2(RELA, 1, 1) }
2304 asso_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2305 { $<ctxt>$ = start_element(ELT_SUB_ASSO_TYPE,
2307 GEDCOM_MAKE_STRING(val1, $4));
2308 START(TYPE, $1, $<ctxt>$)
2313 { end_element(ELT_SUB_ASSO_TYPE, PARENT, $<ctxt>5,
2314 GEDCOM_MAKE_NULL(val1));
2318 asso_rela_sect : OPEN DELIM TAG_RELA mand_line_item
2319 { $<ctxt>$ = start_element(ELT_SUB_ASSO_RELA,
2321 GEDCOM_MAKE_STRING(val1, $4));
2322 START(RELA, $1, $<ctxt>$)
2327 { end_element(ELT_SUB_ASSO_RELA, PARENT, $<ctxt>5,
2328 GEDCOM_MAKE_NULL(val1));
2333 change_date_sub : change_date_chan_sect { OCCUR2(CHAN, 0, 1) }
2336 change_date_chan_sect : OPEN DELIM TAG_CHAN
2337 { $<ctxt>$ = start_element(ELT_SUB_CHAN,
2338 PARENT, $1, $3, NULL,
2339 GEDCOM_MAKE_NULL(val1));
2340 START(CHAN, $1, $<ctxt>$)
2342 change_date_chan_subs
2345 { end_element(ELT_SUB_CHAN, PARENT, $<ctxt>4,
2346 GEDCOM_MAKE_NULL(val1));
2350 change_date_chan_subs : /* empty */
2351 | change_date_chan_subs change_date_chan_sub
2354 change_date_chan_sub : change_date_date_sect { OCCUR2(DATE, 1, 1) }
2359 change_date_date_sect : OPEN DELIM TAG_DATE mand_line_item
2360 { struct date_value dv = gedcom_parse_date($4);
2361 $<ctxt>$ = start_element(ELT_SUB_CHAN_DATE,
2363 GEDCOM_MAKE_DATE(val1, dv));
2364 START(DATE, $1, $<ctxt>$) }
2365 change_date_date_subs
2368 { end_element(ELT_SUB_CHAN_DATE, PARENT, $<ctxt>5,
2369 GEDCOM_MAKE_NULL(val1));
2373 change_date_date_subs : /* empty */
2374 | change_date_date_subs change_date_date_sub
2377 change_date_date_sub : change_date_date_time_sect { OCCUR2(TIME, 0, 1) }
2381 change_date_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
2383 = start_element(ELT_SUB_CHAN_TIME,
2385 GEDCOM_MAKE_STRING(val1, $4));
2386 START(TIME, $1, $<ctxt>$)
2391 { end_element(ELT_SUB_CHAN_TIME, PARENT, $<ctxt>5,
2392 GEDCOM_MAKE_NULL(val1));
2396 /* CHILD TO FAMILY LINK */
2397 chi_fam_link_sub : famc_sect /* 0:M */
2400 famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2401 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2403 if (xr == NULL) HANDLE_ERROR;
2404 $<ctxt>$ = start_element(ELT_SUB_FAMC,
2406 GEDCOM_MAKE_XREF_PTR(val1, xr));
2407 START(FAMC, $1, $<ctxt>$)
2412 { end_element(ELT_SUB_FAMC, PARENT, $<ctxt>5,
2413 GEDCOM_MAKE_NULL(val1));
2417 famc_subs : /* empty */
2418 | famc_subs famc_sub
2421 famc_sub : famc_pedi_sect /* 0:M */
2426 famc_pedi_sect : OPEN DELIM TAG_PEDI mand_line_item
2427 { $<ctxt>$ = start_element(ELT_SUB_FAMC_PEDI,
2429 GEDCOM_MAKE_STRING(val1, $4));
2430 START(PEDI, $1, $<ctxt>$)
2435 { end_element(ELT_SUB_FAMC_PEDI, PARENT, $<ctxt>5,
2436 GEDCOM_MAKE_NULL(val1));
2440 /* CONTINUATION SUBSECTIONS */
2441 continuation_sub : cont_sect /* 0:M */
2442 | conc_sect /* 0:M */
2445 cont_sect : OPEN DELIM TAG_CONT opt_line_item
2446 { $<ctxt>$ = start_element(ELT_SUB_CONT,
2448 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2449 SAFE_BUF_ADDCHAR(&concat_buffer, '\n');
2450 if (GEDCOM_IS_STRING(&val1))
2451 safe_buf_append(&concat_buffer, $4);
2452 START(CONT, $1, $<ctxt>$)
2457 { end_element(ELT_SUB_CONT, PARENT, $<ctxt>5,
2458 GEDCOM_MAKE_NULL(val1));
2462 conc_sect : OPEN DELIM TAG_CONC mand_line_item
2463 { $<ctxt>$ = start_element(ELT_SUB_CONC,
2465 GEDCOM_MAKE_STRING(val1, $4));
2466 if (compat_mode(C_CONC_NEEDS_SPACE)) {
2467 safe_buf_append(&concat_buffer, " ");
2469 safe_buf_append(&concat_buffer, $4);
2470 START(CONC, $1, $<ctxt>$)
2475 { end_element(ELT_SUB_CONC, PARENT, $<ctxt>5,
2476 GEDCOM_MAKE_NULL(val1));
2480 cont_conc_subs : /* empty */
2481 | cont_conc_subs cont_conc_sub
2484 cont_conc_sub : cont_conc_sour_sect { if (!compat_mode(C_NOTE_CONC_SOUR))
2485 INVALID_TAG("SOUR");
2486 OCCUR2(SOUR, 0, 1) }
2490 /* Only for compatibility */
2491 cont_conc_sour_sect : OPEN DELIM TAG_SOUR DELIM POINTER
2492 { if (compat_mode(C_NOTE_CONC_SOUR)) {
2494 = compat_generate_note_sour_start(GRANDPARENT(1),
2496 if ($<ctxt>$ == (void*)-1) HANDLE_ERROR;
2501 { if (compat_mode(C_NOTE_CONC_SOUR)) {
2502 compat_generate_note_sour_end($<ctxt>6);
2508 event_detail_sub : event_detail_type_sect { OCCUR2(TYPE, 0, 1) }
2509 | event_detail_date_sect { OCCUR2(DATE, 0, 1) }
2512 | event_detail_age_sect { OCCUR2(AGE, 0, 1) }
2513 | event_detail_agnc_sect { OCCUR2(AGNC, 0, 1) }
2514 | event_detail_caus_sect { OCCUR2(CAUS, 0, 1) }
2520 event_detail_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2522 = start_element(ELT_SUB_EVT_TYPE,
2524 GEDCOM_MAKE_STRING(val1, $4));
2525 START(TYPE, $1, $<ctxt>$)
2530 { end_element(ELT_SUB_EVT_TYPE, PARENT, $<ctxt>5,
2531 GEDCOM_MAKE_NULL(val1));
2534 event_detail_date_sect : OPEN DELIM TAG_DATE mand_line_item
2535 { struct date_value dv = gedcom_parse_date($4);
2537 = start_element(ELT_SUB_EVT_DATE,
2539 GEDCOM_MAKE_DATE(val1, dv));
2540 START(DATE, $1, $<ctxt>$)
2545 { end_element(ELT_SUB_EVT_DATE, PARENT, $<ctxt>5,
2546 GEDCOM_MAKE_NULL(val1));
2549 event_detail_age_sect : OPEN DELIM TAG_AGE mand_line_item
2550 { struct age_value age = gedcom_parse_age($4);
2552 = start_element(ELT_SUB_EVT_AGE,
2554 GEDCOM_MAKE_AGE(val1, age));
2555 START(AGE, $1, $<ctxt>$)
2560 { end_element(ELT_SUB_EVT_AGE, PARENT, $<ctxt>5,
2561 GEDCOM_MAKE_NULL(val1));
2564 event_detail_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
2566 = start_element(ELT_SUB_EVT_AGNC,
2568 GEDCOM_MAKE_STRING(val1, $4));
2569 START(AGNC, $1, $<ctxt>$)
2574 { end_element(ELT_SUB_EVT_AGNC, PARENT, $<ctxt>5,
2575 GEDCOM_MAKE_NULL(val1));
2578 event_detail_caus_sect : OPEN DELIM TAG_CAUS mand_line_item
2580 = start_element(ELT_SUB_EVT_CAUS,
2582 GEDCOM_MAKE_STRING(val1, $4));
2583 START(CAUS, $1, $<ctxt>$)
2588 { end_element(ELT_SUB_EVT_CAUS, PARENT, $<ctxt>5,
2589 GEDCOM_MAKE_NULL(val1));
2593 /* FAMILY EVENT STRUCTURE */
2594 fam_event_struc_sub : fam_event_sect
2595 | fam_gen_even_sect /* 0:M */
2598 fam_event_sect : OPEN DELIM fam_event_tag opt_value
2600 = start_element(ELT_SUB_FAM_EVT,
2602 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2603 START2($1, $<ctxt>$);
2608 { end_element(ELT_SUB_FAM_EVT, PARENT, $<ctxt>5,
2609 GEDCOM_MAKE_NULL(val1));
2613 fam_event_tag : TAG_ANUL { $$ = $1; START1(ANUL) }
2614 | TAG_CENS { $$ = $1; START1(CENS) }
2615 | TAG_DIV { $$ = $1; START1(DIV) }
2616 | TAG_DIVF { $$ = $1; START1(DIVF) }
2617 | TAG_ENGA { $$ = $1; START1(ENGA) }
2618 | TAG_MARR { $$ = $1; START1(MARR) }
2619 | TAG_MARB { $$ = $1; START1(MARB) }
2620 | TAG_MARC { $$ = $1; START1(MARC) }
2621 | TAG_MARL { $$ = $1; START1(MARL) }
2622 | TAG_MARS { $$ = $1; START1(MARS) }
2625 fam_event_subs : /* empty */
2626 | fam_event_subs fam_event_sub
2629 fam_event_sub : event_detail_sub
2630 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2631 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2635 fam_even_husb_sect : OPEN DELIM TAG_HUSB
2636 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_HUSB,
2637 PARENT, $1, $3, NULL,
2638 GEDCOM_MAKE_NULL(val1));
2639 START(HUSB, $1, $<ctxt>$)
2644 { end_element(ELT_SUB_FAM_EVT_HUSB, PARENT, $<ctxt>4,
2645 GEDCOM_MAKE_NULL(val1));
2649 fam_even_husb_subs : /* empty */
2650 | fam_even_husb_subs fam_even_husb_sub
2653 fam_even_husb_sub : fam_even_age_sect { OCCUR2(AGE, 1, 1) }
2657 fam_even_age_sect : OPEN DELIM TAG_AGE mand_line_item
2658 { struct age_value age = gedcom_parse_age($4);
2659 $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_AGE,
2661 GEDCOM_MAKE_AGE(val1, age));
2662 START(AGE, $1, $<ctxt>$)
2667 { end_element(ELT_SUB_FAM_EVT_AGE, PARENT, $<ctxt>5,
2668 GEDCOM_MAKE_NULL(val1));
2672 fam_even_wife_sect : OPEN DELIM TAG_WIFE
2673 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_WIFE,
2674 PARENT, $1, $3, NULL,
2675 GEDCOM_MAKE_NULL(val1));
2676 START(WIFE, $1, $<ctxt>$)
2681 { end_element(ELT_SUB_FAM_EVT_WIFE, PARENT, $<ctxt>4,
2682 GEDCOM_MAKE_NULL(val1));
2686 fam_gen_even_sect : OPEN DELIM TAG_EVEN
2687 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_EVEN,
2688 PARENT, $1, $3, NULL,
2689 GEDCOM_MAKE_NULL(val1));
2690 START(EVEN, $1, $<ctxt>$)
2695 { end_element(ELT_SUB_FAM_EVT_EVEN, PARENT, $<ctxt>4,
2696 GEDCOM_MAKE_NULL(val1));
2700 fam_gen_even_subs : /* empty */
2701 | fam_gen_even_subs fam_gen_even_sub
2704 fam_gen_even_sub : event_detail_sub
2705 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2706 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2710 /* IDENTIFICATION STRUCTURE */
2711 ident_struc_sub : ident_refn_sect /* 0:M */
2712 | ident_rin_sect { OCCUR2(RIN, 0, 1) }
2715 ident_refn_sect : OPEN DELIM TAG_REFN mand_line_item
2716 { $<ctxt>$ = start_element(ELT_SUB_IDENT_REFN,
2718 GEDCOM_MAKE_STRING(val1, $4));
2719 START(REFN, $1, $<ctxt>$)
2724 { end_element(ELT_SUB_IDENT_REFN, PARENT, $<ctxt>5,
2725 GEDCOM_MAKE_NULL(val1));
2729 ident_refn_subs : /* empty */
2730 | ident_refn_subs ident_refn_sub
2733 ident_refn_sub : ident_refn_type_sect { OCCUR2(TYPE, 0, 1) }
2737 ident_refn_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2739 = start_element(ELT_SUB_IDENT_REFN_TYPE,
2741 GEDCOM_MAKE_STRING(val1, $4));
2742 START(TYPE, $1, $<ctxt>$)
2747 { end_element(ELT_SUB_IDENT_REFN_TYPE, PARENT, $<ctxt>5,
2748 GEDCOM_MAKE_NULL(val1));
2752 ident_rin_sect : OPEN DELIM TAG_RIN mand_line_item
2753 { $<ctxt>$ = start_element(ELT_SUB_IDENT_RIN,
2755 GEDCOM_MAKE_STRING(val1, $4));
2756 START(RIN, $1, $<ctxt>$)
2761 { end_element(ELT_SUB_IDENT_RIN, PARENT, $<ctxt>5,
2762 GEDCOM_MAKE_NULL(val1));
2766 /* INDIVIDUAL ATTRIBUTE STRUCTURE */
2767 indiv_attr_struc_sub : indiv_attr_sect /* 0:M */
2768 | indiv_resi_sect /* 0:M */
2771 indiv_attr_sect : OPEN DELIM indiv_attr_tag mand_line_item
2772 { $<ctxt>$ = start_element(ELT_SUB_INDIV_ATTR,
2774 GEDCOM_MAKE_STRING(val1, $4));
2775 START2($1, $<ctxt>$);
2777 indiv_attr_event_subs
2780 { end_element(ELT_SUB_INDIV_ATTR, PARENT, $<ctxt>5,
2781 GEDCOM_MAKE_NULL(val1));
2785 indiv_attr_tag : TAG_CAST { $$ = $1; START1(CAST) }
2786 | TAG_DSCR { $$ = $1; START1(DSCR) }
2787 | TAG_EDUC { $$ = $1; START1(EDUC) }
2788 | TAG_IDNO { $$ = $1; START1(IDNO) }
2789 | TAG_NATI { $$ = $1; START1(NATI) }
2790 | TAG_NCHI { $$ = $1; START1(NCHI) }
2791 | TAG_NMR { $$ = $1; START1(NMR) }
2792 | TAG_OCCU { $$ = $1; START1(OCCU) }
2793 | TAG_PROP { $$ = $1; START1(PROP) }
2794 | TAG_RELI { $$ = $1; START1(RELI) }
2795 | TAG_SSN { $$ = $1; START1(SSN) }
2796 | TAG_TITL { $$ = $1; START1(TITL) }
2799 indiv_resi_sect : OPEN DELIM TAG_RESI
2800 { $<ctxt>$ = start_element(ELT_SUB_INDIV_RESI,
2801 PARENT, $1, $3, NULL,
2802 GEDCOM_MAKE_NULL(val1));
2803 START(RESI, $1, $<ctxt>$)
2805 indiv_attr_event_subs
2808 { end_element(ELT_SUB_INDIV_RESI, PARENT, $<ctxt>4,
2809 GEDCOM_MAKE_NULL(val1));
2813 indiv_attr_event_subs : /* empty */
2814 | indiv_attr_event_subs indiv_attr_event_sub
2817 indiv_attr_event_sub : event_detail_sub
2821 /* INDIVIDUAL EVENT STRUCTURE */
2822 indiv_even_struc_sub : indiv_birt_sect
2824 | indiv_adop_sect /* 0:M */
2825 | indiv_even_sect /* 0:M */
2828 indiv_birt_sect : OPEN DELIM indiv_birt_tag opt_value
2830 = start_element(ELT_SUB_INDIV_BIRT,
2832 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2833 START2($1, $<ctxt>$);
2838 { end_element(ELT_SUB_INDIV_BIRT, PARENT, $<ctxt>5,
2839 GEDCOM_MAKE_NULL(val1));
2843 indiv_birt_tag : TAG_BIRT { $$ = $1; START1(BIRT) }
2844 | TAG_CHR { $$ = $1; START1(CHR) }
2847 indiv_birt_subs : /* empty */
2848 | indiv_birt_subs indiv_birt_sub
2851 indiv_birt_sub : event_detail_sub
2852 | indiv_birt_famc_sect { OCCUR2(FAMC,0, 1) }
2856 indiv_birt_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2857 { struct xref_value *xr = gedcom_parse_xref($4,
2860 if (xr == NULL) HANDLE_ERROR;
2862 = start_element(ELT_SUB_INDIV_BIRT_FAMC,
2864 GEDCOM_MAKE_XREF_PTR(val1, xr));
2865 START(FAMC, $1, $<ctxt>$)
2870 { end_element(ELT_SUB_INDIV_BIRT_FAMC, PARENT, $<ctxt>5,
2871 GEDCOM_MAKE_NULL(val1));
2875 indiv_gen_sect : OPEN DELIM indiv_gen_tag opt_value
2877 = start_element(ELT_SUB_INDIV_GEN,
2879 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2880 START2($1, $<ctxt>$);
2885 { end_element(ELT_SUB_INDIV_GEN, PARENT, $<ctxt>5,
2886 GEDCOM_MAKE_NULL(val1));
2890 indiv_gen_tag : TAG_DEAT { $$ = $1; START1(DEAT) }
2891 | TAG_BURI { $$ = $1; START1(BURI) }
2892 | TAG_CREM { $$ = $1; START1(CREM) }
2893 | TAG_BAPM { $$ = $1; START1(BAPM) }
2894 | TAG_BARM { $$ = $1; START1(BARM) }
2895 | TAG_BASM { $$ = $1; START1(BASM) }
2896 | TAG_BLES { $$ = $1; START1(BLES) }
2897 | TAG_CHRA { $$ = $1; START1(CHRA) }
2898 | TAG_CONF { $$ = $1; START1(CONF) }
2899 | TAG_FCOM { $$ = $1; START1(FCOM) }
2900 | TAG_ORDN { $$ = $1; START1(ORDN) }
2901 | TAG_NATU { $$ = $1; START1(NATU) }
2902 | TAG_EMIG { $$ = $1; START1(EMIG) }
2903 | TAG_IMMI { $$ = $1; START1(IMMI) }
2904 | TAG_CENS { $$ = $1; START1(CENS) }
2905 | TAG_PROB { $$ = $1; START1(PROB) }
2906 | TAG_WILL { $$ = $1; START1(WILL) }
2907 | TAG_GRAD { $$ = $1; START1(GRAD) }
2908 | TAG_RETI { $$ = $1; START1(RETI) }
2911 indiv_gen_subs : /* empty */
2912 | indiv_gen_subs indiv_gen_sub
2915 indiv_gen_sub : event_detail_sub
2919 indiv_adop_sect : OPEN DELIM TAG_ADOP opt_value
2921 = start_element(ELT_SUB_INDIV_ADOP,
2923 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2924 START(ADOP, $1, $<ctxt>$) }
2928 { end_element(ELT_SUB_INDIV_ADOP, PARENT, $<ctxt>5,
2929 GEDCOM_MAKE_NULL(val1));
2933 indiv_adop_subs : /* empty */
2934 | indiv_adop_subs indiv_adop_sub
2937 indiv_adop_sub : event_detail_sub
2938 | indiv_adop_famc_sect { OCCUR2(FAMC,0, 1) }
2942 indiv_adop_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2943 { struct xref_value *xr = gedcom_parse_xref($4,
2946 if (xr == NULL) HANDLE_ERROR;
2948 = start_element(ELT_SUB_INDIV_ADOP_FAMC,
2950 GEDCOM_MAKE_XREF_PTR(val1, xr));
2951 START(FAMC, $1, $<ctxt>$) }
2952 indiv_adop_famc_subs
2955 { end_element(ELT_SUB_INDIV_ADOP_FAMC, PARENT, $<ctxt>5,
2956 GEDCOM_MAKE_NULL(val1));
2960 indiv_adop_famc_subs : /* empty */
2961 | indiv_adop_famc_subs indiv_adop_famc_sub
2964 indiv_adop_famc_sub : indiv_adop_famc_adop_sect { OCCUR2(ADOP,0, 1) }
2968 indiv_adop_famc_adop_sect : OPEN DELIM TAG_ADOP mand_line_item
2970 = start_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2972 GEDCOM_MAKE_STRING(val1, $4));
2973 START(ADOP, $1, $<ctxt>$) }
2977 { end_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2979 GEDCOM_MAKE_NULL(val1));
2983 indiv_even_sect : OPEN DELIM TAG_EVEN
2984 { $<ctxt>$ = start_element(ELT_SUB_INDIV_EVEN,
2985 PARENT, $1, $3, NULL,
2986 GEDCOM_MAKE_NULL(val1));
2987 START(EVEN, $1, $<ctxt>$) }
2991 { end_element(ELT_SUB_INDIV_EVEN, PARENT, $<ctxt>4,
2992 GEDCOM_MAKE_NULL(val1));
2996 /* LDS INDIVIDUAL ORDINANCE */
2997 lds_indiv_ord_sub : lio_bapl_sect /* 0:M */
2998 | lio_slgc_sect /* 0:M */
3001 lio_bapl_sect : OPEN DELIM lio_bapl_tag
3002 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL,
3003 PARENT, $1, $3, NULL,
3004 GEDCOM_MAKE_NULL(val1));
3005 START2($1, $<ctxt>$);
3010 { end_element(ELT_SUB_LIO_BAPL, PARENT, $<ctxt>4,
3011 GEDCOM_MAKE_NULL(val1));
3015 lio_bapl_tag : TAG_BAPL { $$ = $1; START1(BAPL) }
3016 | TAG_CONL { $$ = $1; START1(CONL) }
3017 | TAG_ENDL { $$ = $1; START1(ENDL) }
3020 lio_bapl_subs : /* empty */
3021 | lio_bapl_subs lio_bapl_sub
3024 lio_bapl_sub : lio_bapl_stat_sect { OCCUR2(STAT, 0, 1) }
3025 | lio_bapl_date_sect { OCCUR2(DATE, 0, 1) }
3026 | lio_bapl_temp_sect { OCCUR2(TEMP, 0, 1) }
3027 | lio_bapl_plac_sect { OCCUR2(PLAC, 0, 1) }
3033 lio_bapl_stat_sect : OPEN DELIM TAG_STAT mand_line_item
3034 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_STAT,
3036 GEDCOM_MAKE_STRING(val1, $4));
3037 START(STAT, $1, $<ctxt>$)
3042 { end_element(ELT_SUB_LIO_BAPL_STAT, PARENT, $<ctxt>5,
3043 GEDCOM_MAKE_NULL(val1));
3046 lio_bapl_date_sect : OPEN DELIM TAG_DATE mand_line_item
3047 { struct date_value dv = gedcom_parse_date($4);
3048 $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_DATE,
3050 GEDCOM_MAKE_DATE(val1, dv));
3051 START(DATE, $1, $<ctxt>$)
3056 { end_element(ELT_SUB_LIO_BAPL_DATE, PARENT, $<ctxt>5,
3057 GEDCOM_MAKE_NULL(val1));
3060 lio_bapl_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
3061 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_TEMP,
3063 GEDCOM_MAKE_STRING(val1, $4));
3064 START(TEMP, $1, $<ctxt>$)
3069 { end_element(ELT_SUB_LIO_BAPL_TEMP, PARENT, $<ctxt>5,
3070 GEDCOM_MAKE_NULL(val1));
3073 lio_bapl_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
3074 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_PLAC,
3076 GEDCOM_MAKE_STRING(val1, $4));
3077 START(PLAC, $1, $<ctxt>$)
3082 { end_element(ELT_SUB_LIO_BAPL_PLAC, PARENT, $<ctxt>5,
3083 GEDCOM_MAKE_NULL(val1));
3087 lio_slgc_sect : OPEN DELIM TAG_SLGC
3088 { $<ctxt>$ = start_element(ELT_SUB_LIO_SLGC,
3089 PARENT, $1, $3, NULL,
3090 GEDCOM_MAKE_NULL(val1));
3091 START(SLGC, $1, $<ctxt>$)
3094 { if (compat_mode(C_NO_SLGC_FAMC) && ! CHK_COND(FAMC))
3095 compat_generate_slgc_famc_link($<ctxt>4);
3100 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4,
3101 GEDCOM_MAKE_NULL(val1));
3105 lio_slgc_subs : /* empty */
3106 | lio_slgc_subs lio_slgc_sub
3109 lio_slgc_sub : lio_bapl_sub
3110 | lio_slgc_famc_sect { OCCUR2(FAMC, 1, 1) }
3113 lio_slgc_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
3114 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
3116 if (xr == NULL) HANDLE_ERROR;
3118 = start_element(ELT_SUB_LIO_SLGC_FAMC,
3120 GEDCOM_MAKE_XREF_PTR(val1, xr));
3121 START(FAMC, $1, $<ctxt>$)
3126 { end_element(ELT_SUB_LIO_SLGC_FAMC, PARENT, $<ctxt>5,
3127 GEDCOM_MAKE_NULL(val1));
3131 /* LDS SPOUSE SEALING */
3132 lds_spouse_seal_sub : lss_slgs_sect
3135 lss_slgs_sect : OPEN DELIM TAG_SLGS
3136 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS,
3137 PARENT, $1, $3, NULL,
3138 GEDCOM_MAKE_NULL(val1));
3139 START(SLGS, $1, $<ctxt>$) }
3143 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4,
3144 GEDCOM_MAKE_NULL(val1));
3148 lss_slgs_subs : /* empty */
3149 | lss_slgs_subs lss_slgs_sub
3152 lss_slgs_sub : lss_slgs_stat_sect { OCCUR2(STAT, 0, 1) }
3153 | lss_slgs_date_sect { OCCUR2(DATE, 0, 1) }
3154 | lss_slgs_temp_sect { OCCUR2(TEMP, 0, 1) }
3155 | lss_slgs_plac_sect { OCCUR2(PLAC, 0, 1) }
3161 lss_slgs_stat_sect : OPEN DELIM TAG_STAT mand_line_item
3162 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_STAT,
3164 GEDCOM_MAKE_STRING(val1, $4));
3165 START(STAT, $1, $<ctxt>$)
3170 { end_element(ELT_SUB_LSS_SLGS_STAT, PARENT, $<ctxt>5,
3171 GEDCOM_MAKE_NULL(val1));
3174 lss_slgs_date_sect : OPEN DELIM TAG_DATE mand_line_item
3175 { struct date_value dv = gedcom_parse_date($4);
3176 $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_DATE,
3178 GEDCOM_MAKE_DATE(val1, dv));
3179 START(DATE, $1, $<ctxt>$)
3184 { end_element(ELT_SUB_LSS_SLGS_DATE, PARENT, $<ctxt>5,
3185 GEDCOM_MAKE_NULL(val1));
3188 lss_slgs_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
3189 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_TEMP,
3191 GEDCOM_MAKE_STRING(val1, $4));
3192 START(TEMP, $1, $<ctxt>$)
3197 { end_element(ELT_SUB_LSS_SLGS_TEMP, PARENT, $<ctxt>5,
3198 GEDCOM_MAKE_NULL(val1));
3201 lss_slgs_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
3202 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_PLAC,
3204 GEDCOM_MAKE_STRING(val1, $4));
3205 START(PLAC, $1, $<ctxt>$)
3210 { end_element(ELT_SUB_LSS_SLGS_PLAC, PARENT, $<ctxt>5,
3211 GEDCOM_MAKE_NULL(val1));
3215 /* MULTIMEDIA LINK */
3216 multim_link_sub : multim_obje_link_sect
3217 | multim_obje_emb_sect
3220 multim_obje_link_sect : OPEN DELIM TAG_OBJE DELIM POINTER
3221 { struct xref_value *xr = gedcom_parse_xref($5,
3224 if (xr == NULL) HANDLE_ERROR;
3226 = start_element(ELT_SUB_MULTIM_OBJE,
3228 GEDCOM_MAKE_XREF_PTR(val1, xr));
3229 START(OBJE, $1, $<ctxt>$)
3234 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>6,
3235 GEDCOM_MAKE_NULL(val1));
3239 multim_obje_emb_sect : OPEN DELIM TAG_OBJE
3240 { $<ctxt>$ = start_element(ELT_SUB_MULTIM_OBJE,
3241 PARENT, $1, $3, NULL,
3242 GEDCOM_MAKE_NULL(val1));
3243 START(OBJE, $1, $<ctxt>$)
3245 multim_obje_emb_subs
3246 { CHECK2(FORM,FILE) }
3248 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>4,
3249 GEDCOM_MAKE_NULL(val1));
3253 multim_obje_emb_subs : /* empty */
3254 | multim_obje_emb_subs multim_obje_emb_sub
3257 multim_obje_emb_sub : multim_obje_form_sect { OCCUR2(FORM, 1, 1) }
3258 | multim_obje_titl_sect { OCCUR2(TITL, 0, 1) }
3259 | multim_obje_file_sect { OCCUR2(FILE, 1, 1) }
3264 multim_obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
3266 = start_element(ELT_SUB_MULTIM_OBJE_FORM,
3268 GEDCOM_MAKE_STRING(val1, $4));
3269 START(FORM, $1, $<ctxt>$)
3274 { end_element(ELT_SUB_MULTIM_OBJE_FORM,
3276 GEDCOM_MAKE_NULL(val1));
3279 multim_obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
3281 = start_element(ELT_SUB_MULTIM_OBJE_TITL,
3283 GEDCOM_MAKE_STRING(val1, $4));
3284 START(TITL, $1, $<ctxt>$)
3289 { end_element(ELT_SUB_MULTIM_OBJE_TITL,
3291 GEDCOM_MAKE_NULL(val1));
3294 multim_obje_file_sect : OPEN DELIM TAG_FILE mand_line_item
3296 = start_element(ELT_SUB_MULTIM_OBJE_FILE,
3298 GEDCOM_MAKE_STRING(val1, $4));
3299 START(FILE, $1, $<ctxt>$)
3304 { end_element(ELT_SUB_MULTIM_OBJE_FILE,
3306 GEDCOM_MAKE_NULL(val1));
3310 /* NOTE STRUCTURE */
3311 note_struc_sub : note_struc_link_sect /* 0:M */
3312 | note_struc_emb_sect /* 0:M */
3315 note_struc_link_sect : OPEN DELIM TAG_NOTE DELIM POINTER
3316 { struct xref_value *xr = gedcom_parse_xref($5,
3319 if (xr == NULL) HANDLE_ERROR;
3321 = start_element(ELT_SUB_NOTE,
3323 GEDCOM_MAKE_XREF_PTR(val1, xr));
3324 START(NOTE, $1, $<ctxt>$)
3326 note_struc_link_subs
3329 { end_element(ELT_SUB_NOTE, PARENT, $<ctxt>6,
3330 GEDCOM_MAKE_NULL(val1));
3334 note_struc_link_subs : /* empty */
3335 | note_struc_link_subs note_struc_link_sub
3338 note_struc_link_sub : source_cit_sub
3342 note_struc_emb_sect : OPEN DELIM TAG_NOTE opt_line_item
3344 if (compat_mode(C_NOTE_TOO_LONG))
3345 str = compat_long_line_get_prefix($4);
3347 = start_element(ELT_SUB_NOTE,
3348 PARENT, $1, $3, str,
3349 GEDCOM_MAKE_NULL_OR_STRING(val1, str));
3350 reset_buffer(&concat_buffer);
3352 safe_buf_append(&concat_buffer, $4);
3353 START(NOTE, $1, $<ctxt>$);
3354 if (compat_mode(C_NOTE_TOO_LONG))
3355 compat_long_line_finish($<ctxt>$, $1);
3360 { char* complete = get_buf_string(&concat_buffer);
3361 end_element(ELT_SUB_NOTE, PARENT, $<ctxt>5,
3362 GEDCOM_MAKE_STRING(val1, complete));
3366 note_struc_emb_subs : /* empty */
3367 | note_struc_emb_subs note_struc_emb_sub
3370 note_struc_emb_sub : continuation_sub
3375 /* PERSONAL NAME STRUCTURE */
3376 pers_name_struc_sub : pers_name_sect /* 0:M */
3379 pers_name_sect : OPEN DELIM TAG_NAME mand_line_item
3380 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME,
3382 GEDCOM_MAKE_STRING(val1, $4));
3383 START(NAME, $1, $<ctxt>$)
3388 { end_element(ELT_SUB_PERS_NAME, PARENT, $<ctxt>5,
3389 GEDCOM_MAKE_NULL(val1));
3393 pers_name_subs : /* empty */
3394 | pers_name_subs pers_name_sub
3397 pers_name_sub : pers_name_npfx_sect { OCCUR2(NPFX, 0, 1) }
3398 | pers_name_givn_sect { OCCUR2(GIVN, 0, 1) }
3399 | pers_name_nick_sect { OCCUR2(NICK, 0, 1) }
3400 | pers_name_spfx_sect { OCCUR2(SPFX, 0, 1) }
3401 | pers_name_surn_sect { OCCUR2(SURN, 0, 1) }
3402 | pers_name_nsfx_sect { OCCUR2(NSFX, 0, 1) }
3408 pers_name_npfx_sect : OPEN DELIM TAG_NPFX mand_line_item
3409 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NPFX,
3411 GEDCOM_MAKE_STRING(val1, $4));
3412 START(NPFX, $1, $<ctxt>$)
3417 { end_element(ELT_SUB_PERS_NAME_NPFX, PARENT, $<ctxt>5,
3418 GEDCOM_MAKE_NULL(val1));
3421 pers_name_givn_sect : OPEN DELIM TAG_GIVN mand_line_item
3422 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_GIVN,
3424 GEDCOM_MAKE_STRING(val1, $4));
3425 START(GIVN, $1, $<ctxt>$)
3430 { end_element(ELT_SUB_PERS_NAME_GIVN, PARENT, $<ctxt>5,
3431 GEDCOM_MAKE_NULL(val1));
3434 pers_name_nick_sect : OPEN DELIM TAG_NICK mand_line_item
3435 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NICK,
3437 GEDCOM_MAKE_STRING(val1, $4));
3438 START(NICK, $1, $<ctxt>$)
3443 { end_element(ELT_SUB_PERS_NAME_NICK, PARENT, $<ctxt>5,
3444 GEDCOM_MAKE_NULL(val1));
3447 pers_name_spfx_sect : OPEN DELIM TAG_SPFX mand_line_item
3448 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SPFX,
3450 GEDCOM_MAKE_STRING(val1, $4));
3451 START(SPFX, $1, $<ctxt>$)
3456 { end_element(ELT_SUB_PERS_NAME_SPFX, PARENT, $<ctxt>5,
3457 GEDCOM_MAKE_NULL(val1));
3460 pers_name_surn_sect : OPEN DELIM TAG_SURN mand_line_item
3461 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SURN,
3463 GEDCOM_MAKE_STRING(val1, $4));
3464 START(SURN, $1, $<ctxt>$)
3469 { end_element(ELT_SUB_PERS_NAME_SURN, PARENT, $<ctxt>5,
3470 GEDCOM_MAKE_NULL(val1));
3473 pers_name_nsfx_sect : OPEN DELIM TAG_NSFX mand_line_item
3474 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NSFX,
3476 GEDCOM_MAKE_STRING(val1, $4));
3477 START(NSFX, $1, $<ctxt>$)
3482 { end_element(ELT_SUB_PERS_NAME_NSFX, PARENT, $<ctxt>5,
3483 GEDCOM_MAKE_NULL(val1));
3487 /* PLACE STRUCTURE */
3488 place_struc_sub : place_struc_plac_sect /* 0:M */
3491 place_struc_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
3493 = start_element(ELT_SUB_PLAC,
3495 GEDCOM_MAKE_STRING(val1, $4));
3496 START(PLAC, $1, $<ctxt>$)
3498 place_struc_plac_subs
3501 { end_element(ELT_SUB_PLAC, PARENT, $<ctxt>5,
3502 GEDCOM_MAKE_NULL(val1));
3506 place_struc_plac_subs : /* empty */
3507 | place_struc_plac_subs place_struc_plac_sub
3510 place_struc_plac_sub : place_plac_form_sect { OCCUR2(FORM, 0, 1) }
3516 place_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
3518 = start_element(ELT_SUB_PLAC_FORM,
3520 GEDCOM_MAKE_STRING(val1, $4));
3521 START(FORM, $1, $<ctxt>$)
3526 { end_element(ELT_SUB_PLAC_FORM, PARENT, $<ctxt>5,
3527 GEDCOM_MAKE_NULL(val1));
3531 /* SOURCE_CITATION */
3532 source_cit_sub : source_cit_link_sect /* 0:M */
3533 | source_cit_emb_sect /* 0:M */
3536 source_cit_link_sect : OPEN DELIM TAG_SOUR DELIM POINTER
3537 { struct xref_value *xr = gedcom_parse_xref($5,
3540 if (xr == NULL) HANDLE_ERROR;
3542 = start_element(ELT_SUB_SOUR,
3544 GEDCOM_MAKE_XREF_PTR(val1, xr));
3545 START(SOUR, $1, $<ctxt>$)
3547 source_cit_link_subs
3550 { end_element(ELT_SUB_SOUR, PARENT, $<ctxt>6,
3551 GEDCOM_MAKE_NULL(val1));
3555 source_cit_link_subs : /* empty */
3556 | source_cit_link_subs source_cit_link_sub
3559 source_cit_link_sub : source_cit_page_sect { OCCUR2(PAGE, 0, 1) }
3560 | source_cit_even_sect { OCCUR2(EVEN, 0, 1) }
3561 | source_cit_data_sect { OCCUR2(DATA, 0, 1) }
3562 | source_cit_quay_sect { OCCUR2(QUAY, 0, 1) }
3568 source_cit_page_sect : OPEN DELIM TAG_PAGE mand_line_item
3570 = start_element(ELT_SUB_SOUR_PAGE,
3572 GEDCOM_MAKE_STRING(val1, $4));
3573 START(PAGE, $1, $<ctxt>$)
3578 { end_element(ELT_SUB_SOUR_PAGE, PARENT, $<ctxt>5,
3579 GEDCOM_MAKE_NULL(val1));
3583 source_cit_even_sect : OPEN DELIM TAG_EVEN mand_line_item
3585 = start_element(ELT_SUB_SOUR_EVEN,
3587 GEDCOM_MAKE_STRING(val1, $4));
3588 START(EVEN, $1, $<ctxt>$)
3590 source_cit_even_subs
3593 { end_element(ELT_SUB_SOUR_EVEN, PARENT, $<ctxt>5,
3594 GEDCOM_MAKE_NULL(val1));
3598 source_cit_even_subs : /* empty */
3599 | source_cit_even_subs source_cit_even_sub
3602 source_cit_even_sub : source_cit_even_role_sect { OCCUR2(ROLE, 0, 1) }
3606 source_cit_even_role_sect : OPEN DELIM TAG_ROLE mand_line_item
3608 = start_element(ELT_SUB_SOUR_EVEN_ROLE,
3610 GEDCOM_MAKE_STRING(val1, $4));
3611 START(ROLE, $1, $<ctxt>$)
3616 { end_element(ELT_SUB_SOUR_EVEN_ROLE,
3618 GEDCOM_MAKE_NULL(val1));
3622 source_cit_data_sect : OPEN DELIM TAG_DATA
3623 { $<ctxt>$ = start_element(ELT_SUB_SOUR_DATA,
3624 PARENT, $1, $3, NULL,
3625 GEDCOM_MAKE_NULL(val1));
3626 START(DATA, $1, $<ctxt>$)
3628 source_cit_data_subs
3631 { end_element(ELT_SUB_SOUR_DATA, PARENT, $<ctxt>4,
3632 GEDCOM_MAKE_NULL(val1));
3636 source_cit_data_subs : /* empty */
3637 | source_cit_data_subs source_cit_data_sub
3640 source_cit_data_sub : source_cit_data_date_sect { OCCUR2(DATE, 0, 1) }
3641 | source_cit_text_sect /* 0:M */
3645 source_cit_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
3646 { struct date_value dv = gedcom_parse_date($4);
3648 = start_element(ELT_SUB_SOUR_DATA_DATE,
3650 GEDCOM_MAKE_DATE(val1, dv));
3651 START(DATE, $1, $<ctxt>$)
3656 { end_element(ELT_SUB_SOUR_DATA_DATE,
3658 GEDCOM_MAKE_NULL(val1));
3662 source_cit_text_sect : OPEN DELIM TAG_TEXT mand_line_item
3664 = start_element(ELT_SUB_SOUR_TEXT,
3666 GEDCOM_MAKE_STRING(val1, $4));
3667 reset_buffer(&concat_buffer);
3668 safe_buf_append(&concat_buffer, $4);
3669 START(TEXT, $1, $<ctxt>$)
3671 source_cit_text_subs
3674 { char* complete = get_buf_string(&concat_buffer);
3675 end_element(ELT_SUB_SOUR_TEXT, PARENT, $<ctxt>5,
3676 GEDCOM_MAKE_STRING(val1, complete));
3680 source_cit_text_subs : /* empty */
3681 | source_cit_text_subs source_cit_text_sub
3684 source_cit_text_sub : continuation_sub
3688 source_cit_quay_sect : OPEN DELIM TAG_QUAY mand_line_item
3690 = start_element(ELT_SUB_SOUR_QUAY,
3692 GEDCOM_MAKE_STRING(val1, $4));
3693 START(QUAY, $1, $<ctxt>$)
3698 { end_element(ELT_SUB_SOUR_QUAY, PARENT, $<ctxt>5,
3699 GEDCOM_MAKE_NULL(val1));
3703 source_cit_emb_sect : OPEN DELIM TAG_SOUR mand_line_item
3704 { $<ctxt>$ = start_element(ELT_SUB_SOUR,
3706 GEDCOM_MAKE_STRING(val1, $4));
3707 reset_buffer(&concat_buffer);
3708 safe_buf_append(&concat_buffer, $4);
3709 START(SOUR, $1, $<ctxt>$)
3714 { char* complete = get_buf_string(&concat_buffer);
3715 end_element(ELT_SUB_SOUR, PARENT, $<ctxt>5,
3716 GEDCOM_MAKE_STRING(val1, complete));
3720 source_cit_emb_subs : /* empty */
3721 | source_cit_emb_subs source_cit_emb_sub
3724 source_cit_emb_sub : continuation_sub
3725 | source_cit_text_sect /* 0:M */
3730 /* SOURCE REPOSITORY CITATION */
3731 source_repos_cit_sub : source_repos_repo_sect { OCCUR2(REPO, 0, 1) }
3732 | source_repos_repo_txt_sect
3733 { if (!compat_mode(C_NONSTD_SOUR_TAGS))
3734 INVALID_TAG("REPO");
3739 /* Only for compatibility */
3740 source_repos_repo_txt_sect : OPEN DELIM TAG_REPO opt_line_item
3741 { if (compat_mode(C_NONSTD_SOUR_TAGS)) {
3743 compat_generate_nonstd_sour_start(PARENT, $1, $3, $4,
3748 { if (compat_mode(C_NONSTD_SOUR_TAGS))
3749 compat_generate_nonstd_sour_end(PARENT, $<ctxt>5);
3753 source_repos_repo_sect : OPEN DELIM TAG_REPO DELIM POINTER
3754 { struct xref_value *xr
3755 = gedcom_parse_xref($5, XREF_USED, XREF_REPO);
3756 if (xr == NULL) HANDLE_ERROR;
3758 = start_element(ELT_SUB_REPO,
3760 GEDCOM_MAKE_XREF_PTR(val1, xr));
3761 START(REPO, $1, $<ctxt>$);
3763 source_repos_repo_subs
3766 { end_element(ELT_SUB_REPO, PARENT, $<ctxt>6,
3767 GEDCOM_MAKE_NULL(val1));
3771 source_repos_repo_subs : /* empty */
3772 | source_repos_repo_subs source_repos_repo_sub
3775 source_repos_repo_sub : note_struc_sub
3776 | caln_sect /* 0:M */
3780 caln_sect : OPEN DELIM TAG_CALN mand_line_item
3781 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN,
3783 GEDCOM_MAKE_STRING(val1, $4));
3784 START(CALN, $1, $<ctxt>$)
3789 { end_element(ELT_SUB_REPO_CALN, PARENT, $<ctxt>5,
3790 GEDCOM_MAKE_NULL(val1));
3794 caln_subs : /* empty */
3795 | caln_subs caln_sub
3798 caln_sub : caln_medi_sect { OCCUR2(MEDI, 0, 1) }
3802 caln_medi_sect : OPEN DELIM TAG_MEDI mand_line_item
3803 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN_MEDI,
3805 GEDCOM_MAKE_STRING(val1, $4));
3806 START(MEDI, $1, $<ctxt>$)
3811 { end_element(ELT_SUB_REPO_CALN_MEDI, PARENT, $<ctxt>5,
3812 GEDCOM_MAKE_NULL(val1));
3816 /* SPOUSE TO FAMILY LINK */
3817 spou_fam_link_sub : spou_fam_fams_sect /* 0:M */
3820 spou_fam_fams_sect : OPEN DELIM TAG_FAMS mand_pointer
3821 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
3823 if (xr == NULL) HANDLE_ERROR;
3825 = start_element(ELT_SUB_FAMS,
3827 GEDCOM_MAKE_XREF_PTR(val1, xr));
3828 START(FAMS, $1, $<ctxt>$)
3833 { end_element(ELT_SUB_FAMS, PARENT, $<ctxt>5,
3834 GEDCOM_MAKE_NULL(val1));
3838 spou_fam_fams_subs : /* empty */
3839 | spou_fam_fams_subs spou_fam_fams_sub
3842 spou_fam_fams_sub : note_struc_sub
3846 /*********************************************************************/
3848 /*********************************************************************/
3850 no_std_subs : /* empty */
3851 | no_std_subs no_std_sub
3854 no_std_sub : user_sect /* 0:M */
3857 CLOSE { HANDLE_ERROR }
3860 no_std_rec : user_rec /* 0:M */
3863 CLOSE { HANDLE_ERROR }
3866 user_rec : OPEN DELIM opt_xref USERTAG
3867 { if ($4.string[0] != '_') {
3868 if ((compat_mode(C_551_TAGS)
3869 && compat_check_551_tag($4.string, &usertag_buffer))
3871 (compat_mode(C_NONSTD_SOUR_TAGS)
3872 && compat_check_sour_tag($4.string, &usertag_buffer))) {
3873 $4.string = get_buf_string(&usertag_buffer);
3876 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3883 { struct xref_value *xr = NULL;
3885 xr = gedcom_parse_xref($3, XREF_DEFINED, XREF_USER);
3886 if (xr == NULL) HANDLE_ERROR;
3888 $<ctxt>$ = start_record(REC_USER,
3890 GEDCOM_MAKE_NULL_OR_XREF_PTR(val1, xr),
3892 START($4, $1, $<ctxt>$)
3897 { end_record(REC_USER, $<ctxt>7, GEDCOM_MAKE_NULL(val1)); }
3899 user_sect : OPEN DELIM opt_xref USERTAG
3900 { if ($4.string[0] != '_') {
3901 if ((compat_mode(C_551_TAGS)
3902 && compat_check_551_tag($4.string, &usertag_buffer))
3904 (compat_mode(C_SUBM_COMM)
3905 && compat_check_subm_comm($4.string, get_parenttag(0),
3908 (compat_mode(C_NONSTD_SOUR_TAGS)
3909 && compat_check_sour_tag($4.string, &usertag_buffer))) {
3910 $4.string = get_buf_string(&usertag_buffer);
3913 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3920 { $<ctxt>$ = start_element(ELT_USER, PARENT, $1, $4, $6, &val2);
3921 START($4, $1, $<ctxt>$);
3926 { end_element(ELT_USER, PARENT, $<ctxt>7,
3927 GEDCOM_MAKE_NULL(val1));
3928 if (compat_mode(C_SUBM_COMM))
3929 compat_close_subm_comm();
3933 user_sects : /* empty */ { }
3934 | user_sects user_sect { }
3935 | user_sects gen_sect
3936 { if (compat_mode(C_SUBM_COMM)) {
3939 gedcom_error(_("Standard tag not allowed in user section"));
3945 opt_xref : /* empty */ { $$ = NULL; }
3946 | POINTER DELIM { $$ = $1; }
3949 opt_value : /* empty */ { GEDCOM_MAKE_NULL(val2);
3951 | DELIM POINTER { struct xref_value *xr
3952 = gedcom_parse_xref($2, XREF_USED,
3954 GEDCOM_MAKE_XREF_PTR(val2, xr);
3956 | DELIM line_item { GEDCOM_MAKE_STRING(val2, $2);
3960 mand_pointer : /* empty */ { gedcom_error(_("Missing pointer")); YYERROR; }
3961 | DELIM POINTER { gedcom_debug_print("==Ptr: %s==", $2);
3965 mand_line_item : /* empty */
3966 { if (compat_mode(C_NO_REQUIRED_VALUES)) {
3967 gedcom_debug_print("==Val: ==");
3968 $$ = VALUE_IF_MISSING;
3971 gedcom_error(_("Missing value")); YYERROR;
3974 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3978 opt_line_item : /* empty */ { $$ = NULL; }
3979 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3983 line_item : anychar { size_t i;
3984 reset_buffer(&line_item_buffer);
3985 /* The following also takes care of '@@' */
3986 if (!strncmp($1, "@@", 3))
3987 SAFE_BUF_ADDCHAR(&line_item_buffer, '@')
3989 for (i=0; i < strlen($1); i++)
3990 SAFE_BUF_ADDCHAR(&line_item_buffer, $1[i])
3991 $$ = get_buf_string(&line_item_buffer);
3993 | ESCAPE { size_t i;
3994 reset_buffer(&line_item_buffer);
3995 for (i=0; i < strlen($1); i++)
3996 SAFE_BUF_ADDCHAR(&line_item_buffer, $1[i])
3997 $$ = get_buf_string(&line_item_buffer);
4001 /* The following also takes care of '@@' */
4002 if (!strncmp($2, "@@", 3))
4003 SAFE_BUF_ADDCHAR(&line_item_buffer, '@')
4005 for (i=0; i < strlen($2); i++)
4006 SAFE_BUF_ADDCHAR(&line_item_buffer, $2[i])
4007 $$ = get_buf_string(&line_item_buffer);
4011 for (i=0; i < strlen($2); i++)
4012 SAFE_BUF_ADDCHAR(&line_item_buffer, $2[i])
4013 $$ = get_buf_string(&line_item_buffer);
4015 | line_item error anychar { HANDLE_ERROR; }
4016 | line_item error ESCAPE { HANDLE_ERROR; }
4019 anychar : ANYCHAR { }
4023 error_subs : /* empty */
4024 | error_subs error_sect
4027 error_sect : OPEN DELIM opt_xref anytag opt_value error_subs CLOSE { }
4030 gen_sect : OPEN DELIM opt_xref anystdtag
4031 { if (compat_mode(C_SUBM_COMM)
4032 && compat_check_subm_comm_cont($4.string)) {
4033 /* Will pass here */
4036 INVALID_TAG($4.string);
4040 { if (compat_mode(C_SUBM_COMM)) {
4041 $<ctxt>$ = compat_subm_comm_cont_start(PARENT, $6);
4045 { if (compat_mode(C_SUBM_COMM))
4046 compat_subm_comm_cont_end(PARENT, $<ctxt>7);
4050 gen_rec : gen_rec_top
4054 gen_rec_norm : OPEN DELIM opt_xref anystdtag
4055 { INVALID_TOP_TAG($4.string) }
4056 opt_value opt_sects CLOSE
4060 gen_rec_top : OPEN DELIM anytoptag
4061 { gedcom_error(_("Missing cross-reference")); YYERROR; }
4062 opt_value opt_sects CLOSE
4066 opt_sects : /* empty */ { }
4067 | opt_sects gen_sect { }
4070 anytag : USERTAG { }
4084 anystdtag : TAG_ABBR
4215 /* Functions that handle the counting of subtags */
4217 int* count_arrays[MAXGEDCLEVEL+1];
4218 char tag_stack[MAXGEDCLEVEL+1][MAXSTDTAGLEN+1];
4219 Gedcom_ctxt ctxt_stack[MAXGEDCLEVEL+1];
4221 void push_countarray(int level)
4224 gedcom_debug_print("Push Count level: %d, level: %d", count_level, level);
4225 if (count_level != level + 1) {
4226 gedcom_error(_("Internal error: count level mismatch"));
4229 if (count_level > MAXGEDCLEVEL) {
4230 gedcom_error(_("Internal error: count array overflow"));
4234 gedcom_debug_print("calloc countarray %d", count_level);
4235 count = (int *)calloc(YYNTOKENS, sizeof(int));
4236 if (count == NULL) {
4237 gedcom_error(_("Internal error: count array calloc error"));
4241 count_arrays[count_level] = count;
4246 void set_parenttag(const char* tag)
4248 strncpy(tag_stack[count_level+1], tag, MAXSTDTAGLEN+1);
4251 void set_parentctxt(Gedcom_ctxt ctxt)
4253 ctxt_stack[count_level+1] = ctxt;
4256 char* get_parenttag(int offset)
4258 return tag_stack[count_level - offset];
4261 Gedcom_ctxt get_parentctxt(int offset)
4263 return ctxt_stack[count_level - offset];
4266 int count_tag(int tag)
4268 int *count = count_arrays[count_level];
4269 return ++count[tag - GEDCOMTAGOFFSET];
4272 int check_occurrence(int tag)
4274 int *count = count_arrays[count_level];
4275 return (count[tag - GEDCOMTAGOFFSET] > 0);
4278 void pop_countarray()
4281 gedcom_debug_print("Pop Count level: %d", count_level);
4282 if (count_level < 0) {
4283 gedcom_error(_("Internal error: count array underflow"));
4287 count = count_arrays[count_level];
4288 gedcom_debug_print("free countarray %d", count_level);
4290 count_arrays[count_level] = NULL;
4296 gedcom_debug_print("Cleanup countarrays");
4297 while (count_level > 0) {
4303 void cleanup_concat_buffer()
4305 cleanup_buffer(&concat_buffer);
4308 void cleanup_line_item_buffer()
4310 cleanup_buffer(&line_item_buffer);
4313 void cleanup_usertag_buffer()
4315 cleanup_buffer(&usertag_buffer);
4318 /* Enabling debug mode */
4319 /* level 0: no debugging */
4320 /* level 1: only internal */
4321 /* level 2: also bison */
4324 void gedcom_set_debug_level(int level, FILE* f)
4329 trace_output = stderr;
4331 gedcom_high_level_debug = 1;
4340 int gedcom_debug_print(const char* s, ...)
4343 if (gedcom_high_level_debug) {
4346 res = vfprintf(trace_output, s, ap);
4348 fprintf(trace_output, "\n");
4353 /* Setting the error mechanism */
4354 void gedcom_set_error_handling(Gedcom_err_mech mechanism)
4356 error_mechanism = mechanism;