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
426 if (fail == 1) YYABORT;
434 records : /* empty */
449 /*********************************************************************/
451 /*********************************************************************/
452 head_sect : OPEN DELIM TAG_HEAD
453 { $<ctxt>$ = start_record(REC_HEAD, $1, GEDCOM_MAKE_NULL(val1),
455 NULL, GEDCOM_MAKE_NULL(val2));
456 START(HEAD, $1, $<ctxt>$) }
458 { if (compat_mode(C_NO_SUBMITTER) && ! CHK_COND(SUBM))
459 compat_generate_submitter_link($<ctxt>4);
462 if (compat_mode(C_NO_GEDC) && ! CHK_COND(GEDC))
463 compat_generate_gedcom($<ctxt>4);
466 if (compat_mode(C_NO_CHAR) && ! CHK_COND(CHAR)) {
467 if (compat_generate_char($<ctxt>4)) HANDLE_ERROR;
474 { end_record(REC_HEAD, $<ctxt>4, GEDCOM_MAKE_NULL(val1));
475 if (compat_mode(C_NO_SUBMITTER))
476 compat_generate_submitter();
480 head_subs : /* empty */
484 head_sub : head_sour_sect { OCCUR2(SOUR, 1, 1) }
485 | head_dest_sect { OCCUR2(DEST, 0, 1) }
486 | head_date_sect { OCCUR2(DATE, 0, 1) }
487 | head_time_sect { if (!compat_mode(C_HEAD_TIME))
490 | head_subm_sect { OCCUR2(SUBM, 1, 1) }
491 | head_subn_sect { OCCUR2(SUBN, 0, 1) }
492 | head_file_sect { OCCUR2(FILE, 0, 1) }
493 | head_copr_sect { OCCUR2(COPR, 0, 1) }
494 | head_gedc_sect { OCCUR2(GEDC, 1, 1) }
495 | head_char_sect { OCCUR2(CHAR, 1, 1) }
496 | head_lang_sect { OCCUR2(LANG, 0, 1) }
497 | head_plac_sect { OCCUR2(PLAC, 0, 1) }
498 | head_note_sect { OCCUR2(NOTE, 0, 1) }
503 head_sour_sect : OPEN DELIM TAG_SOUR mand_line_item
504 { set_compatibility_program($4);
505 $<ctxt>$ = start_element(ELT_HEAD_SOUR, PARENT,
507 GEDCOM_MAKE_STRING(val1, $4));
508 START(SOUR, $1, $<ctxt>$)
513 { compute_compatibility();
514 end_element(ELT_HEAD_SOUR, PARENT, $<ctxt>5,
515 GEDCOM_MAKE_NULL(val1)); }
518 head_sour_subs : /* empty */
519 | head_sour_subs head_sour_sub
522 head_sour_sub : head_sour_vers_sect { OCCUR2(VERS, 0, 1) }
523 | head_sour_name_sect { OCCUR2(NAME, 0, 1) }
524 | head_sour_corp_sect { OCCUR2(CORP, 0, 1) }
525 | head_sour_data_sect { OCCUR2(DATA, 0, 1) }
529 head_sour_vers_sect : OPEN DELIM TAG_VERS mand_line_item
530 { set_compatibility_version($4);
531 $<ctxt>$ = start_element(ELT_HEAD_SOUR_VERS, PARENT,
533 GEDCOM_MAKE_STRING(val1, $4));
534 START(VERS, $1, $<ctxt>$)
539 { end_element(ELT_HEAD_SOUR_VERS,
540 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
543 head_sour_name_sect : OPEN DELIM TAG_NAME mand_line_item
544 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_NAME, PARENT,
546 GEDCOM_MAKE_STRING(val1, $4));
547 START(NAME, $1, $<ctxt>$)
552 { end_element(ELT_HEAD_SOUR_NAME,
553 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
556 head_sour_corp_sect : OPEN DELIM TAG_CORP mand_line_item
557 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_CORP, PARENT,
559 GEDCOM_MAKE_STRING(val1, $4));
560 START(CORP, $1, $<ctxt>$)
565 { end_element(ELT_HEAD_SOUR_CORP,
566 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
570 head_sour_corp_subs : /* empty */
571 | head_sour_corp_subs head_sour_corp_sub
574 head_sour_corp_sub : addr_struc_sub /* 0:1 */
578 head_sour_data_sect : OPEN DELIM TAG_DATA mand_line_item
579 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_DATA, PARENT,
581 GEDCOM_MAKE_STRING(val1, $4));
582 START(DATA, $1, $<ctxt>$)
587 { end_element(ELT_HEAD_SOUR_DATA,
588 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
592 head_sour_data_subs : /* empty */
593 | head_sour_data_subs head_sour_data_sub
596 head_sour_data_sub : head_sour_data_date_sect { OCCUR2(DATE, 0, 1) }
597 | head_sour_data_copr_sect { OCCUR2(COPR, 0, 1) }
601 head_sour_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
602 { struct date_value dv = gedcom_parse_date($4);
604 = start_element(ELT_HEAD_SOUR_DATA_DATE,
606 GEDCOM_MAKE_DATE(val1, dv));
607 START(DATE, $1, $<ctxt>$)
612 { end_element(ELT_HEAD_SOUR_DATA_DATE,
614 GEDCOM_MAKE_NULL(val1));
617 head_sour_data_copr_sect : OPEN DELIM TAG_COPR mand_line_item
619 = start_element(ELT_HEAD_SOUR_DATA_COPR,
621 GEDCOM_MAKE_STRING(val1, $4));
622 START(COPR, $1, $<ctxt>$)
627 { end_element(ELT_HEAD_SOUR_DATA_COPR,
629 GEDCOM_MAKE_NULL(val1));
634 head_dest_sect : OPEN DELIM TAG_DEST mand_line_item
635 { $<ctxt>$ = start_element(ELT_HEAD_DEST,
637 GEDCOM_MAKE_STRING(val1, $4));
638 START(DEST, $1, $<ctxt>$)
643 { end_element(ELT_HEAD_DEST,
644 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
649 head_date_sect : OPEN DELIM TAG_DATE mand_line_item
650 { struct date_value dv = gedcom_parse_date($4);
651 $<ctxt>$ = start_element(ELT_HEAD_DATE,
653 GEDCOM_MAKE_DATE(val1, dv));
654 if (compat_mode(C_HEAD_TIME))
655 compat_save_head_date_context($<ctxt>$);
656 START(DATE, $1, $<ctxt>$)
661 { end_element(ELT_HEAD_DATE,
662 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
666 head_date_subs : /* empty */
667 | head_date_subs head_date_sub
670 head_date_sub : head_date_time_sect { OCCUR2(TIME, 0, 1) }
674 head_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
675 { $<ctxt>$ = start_element(ELT_HEAD_DATE_TIME,
677 GEDCOM_MAKE_STRING(val1, $4));
678 START(TIME, $1, $<ctxt>$)
683 { end_element(ELT_HEAD_DATE_TIME,
684 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
688 /* HEAD.TIME (Only for compatibility) */
689 head_time_sect : OPEN DELIM TAG_TIME opt_line_item
690 { if (compat_mode(C_HEAD_TIME)) {
691 $<ctxt>$ = compat_generate_head_time_start($1, $3, $4);
695 { if (compat_mode (C_HEAD_TIME)) {
696 compat_generate_head_time_end($<ctxt>5);
702 head_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
703 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
705 if (xr == NULL) HANDLE_ERROR;
706 $<ctxt>$ = start_element(ELT_HEAD_SUBM,
708 GEDCOM_MAKE_XREF_PTR(val1, xr));
709 START(SUBM, $1, $<ctxt>$)
714 { end_element(ELT_HEAD_SUBM,
715 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
719 head_subn_sect : OPEN DELIM TAG_SUBN mand_pointer
720 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
722 if (xr == NULL) HANDLE_ERROR;
723 $<ctxt>$ = start_element(ELT_HEAD_SUBN,
725 GEDCOM_MAKE_XREF_PTR(val1, xr));
726 START(SUBN, $1, $<ctxt>$)
731 { end_element(ELT_HEAD_SUBN,
732 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
736 head_file_sect : OPEN DELIM TAG_FILE mand_line_item
737 { $<ctxt>$ = start_element(ELT_HEAD_FILE,
739 GEDCOM_MAKE_STRING(val1, $4));
740 START(FILE, $1, $<ctxt>$)
745 { end_element(ELT_HEAD_FILE, PARENT, $<ctxt>5,
746 GEDCOM_MAKE_NULL(val1));
750 head_copr_sect : OPEN DELIM TAG_COPR mand_line_item
751 { $<ctxt>$ = start_element(ELT_HEAD_COPR,
753 GEDCOM_MAKE_STRING(val1, $4));
754 START(COPR, $1, $<ctxt>$)
759 { end_element(ELT_HEAD_COPR, PARENT, $<ctxt>5,
760 GEDCOM_MAKE_NULL(val1));
764 head_gedc_sect : OPEN DELIM TAG_GEDC
765 { $<ctxt>$ = start_element(ELT_HEAD_GEDC,
766 PARENT, $1, $3, NULL,
767 GEDCOM_MAKE_NULL(val1));
768 START(GEDC, $1, $<ctxt>$)
771 { if (compat_mode(C_NO_GEDC_FORM) && ! CHK_COND(FORM))
772 compat_generate_gedcom_form($<ctxt>4);
779 { end_element(ELT_HEAD_GEDC, PARENT, $<ctxt>4,
780 GEDCOM_MAKE_NULL(val1));
784 head_gedc_subs : /* empty */
785 | head_gedc_subs head_gedc_sub
788 head_gedc_sub : head_gedc_vers_sect { OCCUR2(VERS, 1, 1) }
789 | head_gedc_form_sect { OCCUR2(FORM, 1, 1) }
792 head_gedc_vers_sect : OPEN DELIM TAG_VERS mand_line_item
793 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_VERS,
795 GEDCOM_MAKE_STRING(val1, $4));
796 START(VERS, $1, $<ctxt>$)
801 { end_element(ELT_HEAD_GEDC_VERS,
802 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
805 head_gedc_form_sect : OPEN DELIM TAG_FORM mand_line_item
806 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_FORM,
808 GEDCOM_MAKE_STRING(val1, $4));
809 START(FORM, $1, $<ctxt>$)
814 { end_element(ELT_HEAD_GEDC_FORM,
815 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
820 head_char_sect : OPEN DELIM TAG_CHAR mand_line_item
821 { /* Don't allow to continue if conversion context couldn't
823 if (open_conv_to_internal($4) == 0) HANDLE_ERROR;
824 $<ctxt>$ = start_element(ELT_HEAD_CHAR,
826 GEDCOM_MAKE_STRING(val1, $4));
827 START(CHAR, $1, $<ctxt>$)
832 { end_element(ELT_HEAD_CHAR, PARENT, $<ctxt>5,
833 GEDCOM_MAKE_NULL(val1));
837 head_char_subs : /* empty */
838 | head_char_subs head_char_sub
841 head_char_sub : head_char_vers_sect { OCCUR2(VERS, 0, 1) }
844 head_char_vers_sect : OPEN DELIM TAG_VERS mand_line_item
845 { $<ctxt>$ = start_element(ELT_HEAD_CHAR_VERS,
847 GEDCOM_MAKE_STRING(val1, $4));
848 START(VERS, $1, $<ctxt>$)
853 { end_element(ELT_HEAD_CHAR_VERS,
854 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
859 head_lang_sect : OPEN DELIM TAG_LANG mand_line_item
860 { $<ctxt>$ = start_element(ELT_HEAD_LANG,
862 GEDCOM_MAKE_STRING(val1, $4));
863 START(LANG, $1, $<ctxt>$)
868 { end_element(ELT_HEAD_LANG, PARENT, $<ctxt>5,
869 GEDCOM_MAKE_NULL(val1));
873 head_plac_sect : OPEN DELIM TAG_PLAC
874 { $<ctxt>$ = start_element(ELT_HEAD_PLAC,
875 PARENT, $1, $3, NULL,
876 GEDCOM_MAKE_NULL(val1));
877 START(PLAC, $1, $<ctxt>$)
882 { end_element(ELT_HEAD_PLAC, PARENT, $<ctxt>4,
883 GEDCOM_MAKE_NULL(val1));
887 head_plac_subs : /* empty */
888 | head_plac_subs head_plac_sub
891 head_plac_sub : head_plac_form_sect { OCCUR2(FORM, 1, 1) }
894 head_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
895 { $<ctxt>$ = start_element(ELT_HEAD_PLAC_FORM,
897 GEDCOM_MAKE_STRING(val1, $4));
898 START(FORM, $1, $<ctxt>$)
903 { end_element(ELT_HEAD_PLAC_FORM,
904 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
909 head_note_sect : OPEN DELIM TAG_NOTE mand_line_item
910 { $<ctxt>$ = start_element(ELT_HEAD_NOTE,
912 GEDCOM_MAKE_STRING(val1, $4));
913 reset_buffer(&concat_buffer);
914 safe_buf_append(&concat_buffer, $4);
915 START(NOTE, $1, $<ctxt>$)
920 { char* complete = get_buf_string(&concat_buffer);
921 end_element(ELT_HEAD_NOTE, PARENT, $<ctxt>5,
922 GEDCOM_MAKE_STRING(val1, complete));
926 head_note_subs : /* empty */
927 | head_note_subs head_note_sub
930 head_note_sub : continuation_sub /* 0:M */
934 /*********************************************************************/
936 /*********************************************************************/
937 /* Don't need callbacks here, there is no information... */
938 trlr_sect : OPEN DELIM TAG_TRLR CLOSE { }
941 /*********************************************************************/
942 /**** Family record ****/
943 /*********************************************************************/
944 fam_rec : OPEN DELIM POINTER DELIM TAG_FAM
945 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
947 if (xr == NULL) HANDLE_ERROR;
948 $<ctxt>$ = start_record(REC_FAM,
949 $1, GEDCOM_MAKE_XREF_PTR(val1, xr),
951 NULL, GEDCOM_MAKE_NULL(val2));
952 START(FAM, $1, $<ctxt>$) }
956 { end_record(REC_FAM, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
959 fam_subs : /* empty */
963 fam_sub : fam_event_struc_sub /* 0:M */
964 | fam_husb_sect { OCCUR2(HUSB, 0, 1) }
965 | fam_wife_sect { OCCUR2(WIFE, 0, 1) }
966 | fam_chil_sect /* 0:M */
967 | fam_nchi_sect { OCCUR2(NCHI, 0, 1) }
968 | fam_subm_sect /* 0:M */
969 | lds_spouse_seal_sub /* 0:M */
970 | source_cit_sub /* 0:M */
971 | multim_link_sub /* 0:M */
972 | note_struc_sub /* 0:M */
973 | ident_struc_sub /* 0:1 */
974 | change_date_sub /* 0:1 */
979 fam_husb_sect : OPEN DELIM TAG_HUSB mand_pointer
980 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
982 if (xr == NULL) HANDLE_ERROR;
983 $<ctxt>$ = start_element(ELT_FAM_HUSB,
985 GEDCOM_MAKE_XREF_PTR(val1, xr));
986 START(HUSB, $1, $<ctxt>$)
991 { end_element(ELT_FAM_HUSB, PARENT, $<ctxt>5,
992 GEDCOM_MAKE_NULL(val1));
997 fam_wife_sect : OPEN DELIM TAG_WIFE mand_pointer
998 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1000 if (xr == NULL) HANDLE_ERROR;
1001 $<ctxt>$ = start_element(ELT_FAM_WIFE,
1003 GEDCOM_MAKE_XREF_PTR(val1, xr));
1004 START(WIFE, $1, $<ctxt>$)
1009 { end_element(ELT_FAM_WIFE, PARENT, $<ctxt>5,
1010 GEDCOM_MAKE_NULL(val1));
1015 fam_chil_sect : OPEN DELIM TAG_CHIL mand_pointer
1016 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1018 if (xr == NULL) HANDLE_ERROR;
1019 $<ctxt>$ = start_element(ELT_FAM_CHIL,
1021 GEDCOM_MAKE_XREF_PTR(val1, xr));
1022 START(CHIL, $1, $<ctxt>$)
1027 { end_element(ELT_FAM_CHIL, PARENT, $<ctxt>5,
1028 GEDCOM_MAKE_NULL(val1));
1033 fam_nchi_sect : OPEN DELIM TAG_NCHI mand_line_item
1034 { $<ctxt>$ = start_element(ELT_FAM_NCHI,
1036 GEDCOM_MAKE_STRING(val1, $4));
1037 START(NCHI, $1, $<ctxt>$)
1042 { end_element(ELT_FAM_NCHI, PARENT, $<ctxt>5,
1043 GEDCOM_MAKE_NULL(val1));
1048 fam_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1049 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1051 if (xr == NULL) HANDLE_ERROR;
1052 $<ctxt>$ = start_element(ELT_FAM_SUBM,
1054 GEDCOM_MAKE_XREF_PTR(val1, xr));
1055 START(SUBM, $1, $<ctxt>$)
1060 { end_element(ELT_FAM_SUBM, PARENT, $<ctxt>5,
1061 GEDCOM_MAKE_NULL(val1));
1065 /*********************************************************************/
1066 /**** Individual record ****/
1067 /*********************************************************************/
1068 indiv_rec : OPEN DELIM POINTER DELIM TAG_INDI
1069 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1071 if (xr == NULL) HANDLE_ERROR;
1072 $<ctxt>$ = start_record(REC_INDI,
1073 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1074 NULL, GEDCOM_MAKE_NULL(val2));
1075 START(INDI, $1, $<ctxt>$) }
1079 { end_record(REC_INDI, $<ctxt>6, GEDCOM_MAKE_NULL(val1));
1080 if (compat_mode(C_NO_SLGC_FAMC))
1081 compat_generate_slgc_famc_fam();
1085 indi_subs : /* empty */
1086 | indi_subs indi_sub
1089 indi_sub : indi_resn_sect { OCCUR2(RESN, 0, 1) }
1090 | pers_name_struc_sub /* 0:M */
1091 | indi_sex_sect { OCCUR2(SEX, 0, 1) }
1092 | indiv_even_struc_sub /* 0:M */
1093 | indiv_attr_struc_sub /* 0:M */
1094 | lds_indiv_ord_sub /* 0:M */
1095 | chi_fam_link_sub /* 0:M */
1096 | spou_fam_link_sub /* 0:M */
1097 | indi_subm_sect /* 0:M */
1098 | assoc_struc_sub /* 0:M */
1099 | indi_alia_sect /* 0:M */
1100 | indi_anci_sect /* 0:M */
1101 | indi_desi_sect /* 0:M */
1102 | source_cit_sub /* 0:M */
1103 | multim_link_sub /* 0:M */
1104 | note_struc_sub /* 0:M */
1105 | indi_rfn_sect { OCCUR2(RFN, 0, 1) }
1106 | indi_afn_sect /* 0:M */
1107 | ident_struc_sub /* 0:1 */
1108 | change_date_sub /* 0:1 */
1109 | indi_addr_sect { if (!compat_mode(C_INDI_ADDR))
1110 INVALID_TAG("ADDR");
1116 indi_resn_sect : OPEN DELIM TAG_RESN mand_line_item
1117 { $<ctxt>$ = start_element(ELT_INDI_RESN,
1119 GEDCOM_MAKE_STRING(val1, $4));
1120 START(RESN, $1, $<ctxt>$)
1125 { end_element(ELT_INDI_RESN, PARENT, $<ctxt>5,
1126 GEDCOM_MAKE_NULL(val1));
1131 indi_sex_sect : OPEN DELIM TAG_SEX mand_line_item
1132 { $<ctxt>$ = start_element(ELT_INDI_SEX,
1134 GEDCOM_MAKE_STRING(val1, $4));
1135 START(SEX, $1, $<ctxt>$)
1140 { end_element(ELT_INDI_SEX, PARENT, $<ctxt>5,
1141 GEDCOM_MAKE_NULL(val1));
1146 indi_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1147 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1149 if (xr == NULL) HANDLE_ERROR;
1150 $<ctxt>$ = start_element(ELT_INDI_SUBM,
1152 GEDCOM_MAKE_XREF_PTR(val1, xr));
1153 START(SUBM, $1, $<ctxt>$)
1158 { end_element(ELT_INDI_SUBM, PARENT, $<ctxt>5,
1159 GEDCOM_MAKE_NULL(val1));
1164 indi_alia_sect : OPEN DELIM TAG_ALIA mand_pointer
1165 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1167 if (xr == NULL) HANDLE_ERROR;
1168 $<ctxt>$ = start_element(ELT_INDI_ALIA,
1170 GEDCOM_MAKE_XREF_PTR(val1, xr));
1171 START(ALIA, $1, $<ctxt>$)
1176 { end_element(ELT_INDI_ALIA, PARENT, $<ctxt>5,
1177 GEDCOM_MAKE_NULL(val1));
1182 indi_anci_sect : OPEN DELIM TAG_ANCI mand_pointer
1183 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1185 if (xr == NULL) HANDLE_ERROR;
1186 $<ctxt>$ = start_element(ELT_INDI_ANCI,
1188 GEDCOM_MAKE_XREF_PTR(val1, xr));
1189 START(ANCI, $1, $<ctxt>$)
1194 { end_element(ELT_INDI_ANCI, PARENT, $<ctxt>5,
1195 GEDCOM_MAKE_NULL(val1));
1200 indi_desi_sect : OPEN DELIM TAG_DESI mand_pointer
1201 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1203 if (xr == NULL) HANDLE_ERROR;
1204 $<ctxt>$ = start_element(ELT_INDI_DESI,
1206 GEDCOM_MAKE_XREF_PTR(val1, xr));
1207 START(DESI, $1, $<ctxt>$)
1212 { end_element(ELT_INDI_DESI, PARENT, $<ctxt>5,
1213 GEDCOM_MAKE_NULL(val1));
1218 indi_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1219 { $<ctxt>$ = start_element(ELT_INDI_RFN,
1221 GEDCOM_MAKE_STRING(val1, $4));
1222 START(RFN, $1, $<ctxt>$)
1227 { end_element(ELT_INDI_RFN, PARENT, $<ctxt>5,
1228 GEDCOM_MAKE_NULL(val1));
1233 indi_afn_sect : OPEN DELIM TAG_AFN mand_line_item
1234 { $<ctxt>$ = start_element(ELT_INDI_AFN,
1236 GEDCOM_MAKE_STRING(val1, $4));
1237 START(AFN, $1, $<ctxt>$)
1242 { end_element(ELT_INDI_AFN, PARENT, $<ctxt>5,
1243 GEDCOM_MAKE_NULL(val1));
1247 /* INDI.ADDR (Only for compatibility) */
1248 indi_addr_sect : OPEN DELIM TAG_ADDR opt_line_item
1249 { if (compat_mode(C_INDI_ADDR)) {
1250 Gedcom_ctxt par = compat_generate_resi_start(PARENT);
1251 START(RESI, $1, par);
1253 = start_element(ELT_SUB_ADDR,
1254 par, $1 + 1, $3, $4,
1255 GEDCOM_MAKE_NULL_OR_STRING(val2, $4));
1256 reset_buffer(&concat_buffer);
1257 safe_buf_append(&concat_buffer, $4);
1258 START(ADDR, $1 + 1, $<ctxt>$);
1260 else { START(ADDR, $1, NULL) }
1265 { if (compat_mode(C_INDI_ADDR)) {
1266 Gedcom_ctxt par = PARENT;
1267 char* complete = get_buf_string(&concat_buffer);
1268 end_element(ELT_SUB_ADDR, par, $<ctxt>5,
1269 GEDCOM_MAKE_STRING(val1, complete));
1271 compat_generate_resi_end(PARENT, par);
1276 ftree_addr_subs : /* empty */
1277 | ftree_addr_subs ftree_addr_sub
1280 ftree_addr_sub : continuation_sub
1281 | ftree_addr_phon_sect
1285 ftree_addr_phon_sect : OPEN DELIM TAG_PHON mand_line_item
1287 = start_element(ELT_SUB_PHON,
1288 GRANDPARENT(1), $1, $3, $4,
1289 GEDCOM_MAKE_STRING(val1, $4));
1290 START(PHON, $1, $<ctxt>$)
1295 { end_element(ELT_SUB_PHON, GRANDPARENT(1),
1296 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1300 /*********************************************************************/
1301 /**** Multimedia record ****/
1302 /*********************************************************************/
1303 multim_rec : OPEN DELIM POINTER DELIM TAG_OBJE
1304 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1306 if (xr == NULL) HANDLE_ERROR;
1307 $<ctxt>$ = start_record(REC_OBJE,
1308 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1309 NULL, GEDCOM_MAKE_NULL(val2));
1310 START(OBJE, $1, $<ctxt>$) }
1312 { CHECK2(FORM, BLOB) }
1314 { end_record(REC_OBJE, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1317 obje_subs : /* empty */
1318 | obje_subs obje_sub
1321 obje_sub : obje_form_sect { OCCUR2(FORM, 1, 1) }
1322 | obje_titl_sect { OCCUR2(TITL, 0, 1) }
1323 | note_struc_sub /* 0:M */
1324 | obje_blob_sect { OCCUR2(BLOB, 1, 1) }
1325 | obje_obje_sect { OCCUR2(OBJE, 0, 1) }
1326 | ident_struc_sub /* 0:1 */
1327 | change_date_sub /* 0:1 */
1332 obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
1333 { $<ctxt>$ = start_element(ELT_OBJE_FORM,
1335 GEDCOM_MAKE_STRING(val1, $4));
1336 START(FORM, $1, $<ctxt>$)
1341 { end_element(ELT_OBJE_FORM, PARENT, $<ctxt>5,
1342 GEDCOM_MAKE_NULL(val1));
1347 obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1348 { $<ctxt>$ = start_element(ELT_OBJE_TITL,
1350 GEDCOM_MAKE_STRING(val1, $4));
1351 START(TITL, $1, $<ctxt>$)
1356 { end_element(ELT_OBJE_TITL, PARENT, $<ctxt>5,
1357 GEDCOM_MAKE_NULL(val1));
1362 obje_blob_sect : OPEN DELIM TAG_BLOB
1363 { $<ctxt>$ = start_element(ELT_OBJE_BLOB,
1364 PARENT, $1, $3, NULL,
1365 GEDCOM_MAKE_NULL(val1));
1366 reset_buffer(&concat_buffer);
1367 START(BLOB, $1, $<ctxt>$)
1372 { char* complete = get_buf_string(&concat_buffer);
1373 end_element(ELT_OBJE_BLOB, PARENT, $<ctxt>4,
1374 GEDCOM_MAKE_STRING(val1, complete));
1378 obje_blob_subs : /* empty */
1379 | obje_blob_subs obje_blob_sub
1382 obje_blob_sub : obje_blob_cont_sect { OCCUR1(CONT, 1) }
1386 obje_blob_cont_sect : OPEN DELIM TAG_CONT mand_line_item
1387 { $<ctxt>$ = start_element(ELT_OBJE_BLOB_CONT,
1389 GEDCOM_MAKE_STRING(val1, $4));
1390 safe_buf_append(&concat_buffer, $4);
1391 START(CONT, $1, $<ctxt>$)
1396 { end_element(ELT_OBJE_BLOB_CONT, PARENT,
1397 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1402 obje_obje_sect : OPEN DELIM TAG_OBJE mand_pointer
1403 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1405 if (xr == NULL) HANDLE_ERROR;
1406 $<ctxt>$ = start_element(ELT_OBJE_OBJE,
1408 GEDCOM_MAKE_XREF_PTR(val1, xr));
1409 START(OBJE, $1, $<ctxt>$)
1414 { end_element(ELT_OBJE_OBJE, PARENT, $<ctxt>5,
1415 GEDCOM_MAKE_NULL(val1));
1419 /*********************************************************************/
1420 /**** Note record ****/
1421 /*********************************************************************/
1422 note_rec : OPEN DELIM POINTER DELIM TAG_NOTE note_line_item
1423 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1425 if (xr == NULL) HANDLE_ERROR;
1426 $<ctxt>$ = start_record(REC_NOTE,
1427 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1428 $6, GEDCOM_MAKE_STRING(val2, $6));
1429 reset_buffer(&concat_buffer);
1430 safe_buf_append(&concat_buffer, $6);
1431 START(NOTE, $1, $<ctxt>$) }
1435 { char* complete = get_buf_string(&concat_buffer);
1436 end_record(REC_NOTE, $<ctxt>7,
1437 GEDCOM_MAKE_STRING(val1, complete)); }
1440 note_line_item : /* empty */
1441 { if (!compat_mode(C_NOTE_NO_VALUE)) {
1442 gedcom_error(_("Missing value")); YYERROR;
1445 $$ = VALUE_IF_MISSING;
1449 { gedcom_debug_print("==Val: %s==", $2);
1453 note_subs : /* empty */
1454 | note_subs note_sub
1457 note_sub : continuation_sub /* 0:M */
1458 | source_cit_sub /* 0:M */
1459 | ident_struc_sub /* 0:1 */
1460 | change_date_sub /* 0:1 */
1461 | note_note_sect { if (!compat_mode(C_NOTE_NOTE))
1462 INVALID_TAG("NOTE");
1467 /* Same actions as cont_sect, for compatibility */
1468 note_note_sect : OPEN DELIM TAG_NOTE opt_line_item
1469 { $3.string = "CONT";
1470 $3.value = TAG_CONT;
1471 $<ctxt>$ = start_element(ELT_SUB_CONT,
1473 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
1474 SAFE_BUF_ADDCHAR(&concat_buffer, '\n');
1475 if (GEDCOM_IS_STRING(&val1))
1476 safe_buf_append(&concat_buffer, $4);
1477 START(CONT, $1, $<ctxt>$)
1482 { end_element(ELT_SUB_CONT, PARENT, $<ctxt>5,
1483 GEDCOM_MAKE_NULL(val1));
1487 /*********************************************************************/
1488 /**** Repository record ****/
1489 /*********************************************************************/
1490 repos_rec : OPEN DELIM POINTER DELIM TAG_REPO
1491 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1493 if (xr == NULL) HANDLE_ERROR;
1494 $<ctxt>$ = start_record(REC_REPO,
1495 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1496 NULL, GEDCOM_MAKE_NULL(val2));
1497 START(REPO, $1, $<ctxt>$) }
1501 { end_record(REC_REPO, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1504 repo_subs : /* empty */
1505 | repo_subs repo_sub
1508 repo_sub : repo_name_sect { OCCUR2(NAME, 0, 1) }
1509 | addr_struc_sub /* 0:1 */
1510 | note_struc_sub /* 0:M */
1511 | ident_struc_sub /* 0:1 */
1512 | change_date_sub /* 0:1 */
1517 repo_name_sect : OPEN DELIM TAG_NAME mand_line_item
1518 { $<ctxt>$ = start_element(ELT_REPO_NAME,
1520 GEDCOM_MAKE_STRING(val1, $4));
1521 START(NAME, $1, $<ctxt>$)
1526 { end_element(ELT_REPO_NAME, PARENT, $<ctxt>5,
1527 GEDCOM_MAKE_NULL(val1));
1531 /*********************************************************************/
1532 /**** Source record ****/
1533 /*********************************************************************/
1534 source_rec : OPEN DELIM POINTER DELIM TAG_SOUR
1535 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1537 if (xr == NULL) HANDLE_ERROR;
1538 $<ctxt>$ = start_record(REC_SOUR,
1539 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1540 NULL, GEDCOM_MAKE_NULL(val2));
1541 START(SOUR, $1, $<ctxt>$) }
1545 { end_record(REC_SOUR, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1548 sour_subs : /* empty */
1549 | sour_subs sour_sub
1552 sour_sub : sour_data_sect { OCCUR2(DATA, 0, 1) }
1553 | sour_auth_sect { OCCUR2(AUTH, 0, 1) }
1554 | sour_titl_sect { OCCUR2(TITL, 0, 1) }
1555 | sour_abbr_sect { OCCUR2(ABBR, 0, 1) }
1556 | sour_publ_sect { OCCUR2(PUBL, 0, 1) }
1557 | sour_text_sect { OCCUR2(TEXT, 0, 1) }
1558 | sour_type_sect { if (!compat_mode(C_NONSTD_SOUR_TAGS))
1559 INVALID_TAG("TYPE");
1560 OCCUR2(TYPE, 0, 1) }
1561 | sour_file_sect { if (!compat_mode(C_NONSTD_SOUR_TAGS))
1562 INVALID_TAG("FILE");
1563 OCCUR2(FILE, 0, 1) }
1564 | sour_plac_sect { if (!compat_mode(C_NONSTD_SOUR_TAGS))
1565 INVALID_TAG("PLAC");
1566 OCCUR2(PLAC, 0, 1) }
1567 | sour_date_sect { if (!compat_mode(C_NONSTD_SOUR_TAGS))
1568 INVALID_TAG("DATE");
1569 OCCUR2(DATE, 0, 1) }
1570 | sour_medi_sect { if (!compat_mode(C_NONSTD_SOUR_TAGS))
1571 INVALID_TAG("MEDI");
1572 OCCUR2(MEDI, 0, 1) }
1573 | sour_page_sect { if (!compat_mode(C_NONSTD_SOUR_TAGS))
1574 INVALID_TAG("PAGE");
1575 OCCUR2(PAGE, 0, 1) }
1576 | source_repos_cit_sub /* 0:1 */
1577 | multim_link_sub /* 0:M */
1578 | note_struc_sub /* 0:M */
1579 | ident_struc_sub /* 0:1 */
1580 | change_date_sub /* 0:1 */
1585 sour_data_sect : OPEN DELIM TAG_DATA
1586 { $<ctxt>$ = start_element(ELT_SOUR_DATA,
1587 PARENT, $1, $3, NULL,
1588 GEDCOM_MAKE_NULL(val1));
1589 START(DATA, $1, $<ctxt>$)
1594 { end_element(ELT_SOUR_DATA, PARENT, $<ctxt>4,
1595 GEDCOM_MAKE_NULL(val1));
1599 sour_data_subs : /* empty */
1600 | sour_data_subs sour_data_sub
1603 sour_data_sub : sour_data_even_sect /* 0:M */
1604 | sour_data_agnc_sect { OCCUR2(AGNC, 0, 1) }
1605 | note_struc_sub /* 0:M */
1609 sour_data_even_sect : OPEN DELIM TAG_EVEN mand_line_item
1610 { $<ctxt>$ = start_element(ELT_SOUR_DATA_EVEN,
1612 GEDCOM_MAKE_STRING(val1, $4));
1613 START(EVEN, $1, $<ctxt>$)
1618 { end_element(ELT_SOUR_DATA_EVEN, PARENT,
1619 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1623 sour_data_even_subs : /* empty */
1624 | sour_data_even_subs sour_data_even_sub
1627 sour_data_even_sub : sour_data_even_date_sect { OCCUR2(DATE, 0, 1) }
1628 | sour_data_even_plac_sect { OCCUR2(PLAC, 0, 1) }
1632 sour_data_even_date_sect : OPEN DELIM TAG_DATE mand_line_item
1633 { struct date_value dv = gedcom_parse_date($4);
1635 = start_element(ELT_SOUR_DATA_EVEN_DATE,
1637 GEDCOM_MAKE_DATE(val1, dv));
1638 START(DATE, $1, $<ctxt>$)
1643 { end_element(ELT_SOUR_DATA_EVEN_DATE, PARENT,
1644 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1648 sour_data_even_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
1650 = start_element(ELT_SOUR_DATA_EVEN_PLAC,
1652 GEDCOM_MAKE_STRING(val1, $4));
1653 START(PLAC, $1, $<ctxt>$)
1658 { end_element(ELT_SOUR_DATA_EVEN_PLAC, PARENT,
1659 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1663 sour_data_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
1664 { $<ctxt>$ = start_element(ELT_SOUR_DATA_AGNC,
1666 GEDCOM_MAKE_STRING(val1, $4));
1667 START(AGNC, $1, $<ctxt>$)
1672 { end_element(ELT_SOUR_DATA_AGNC, PARENT,
1673 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1678 sour_auth_sect : OPEN DELIM TAG_AUTH mand_line_item
1679 { $<ctxt>$ = start_element(ELT_SOUR_AUTH,
1681 GEDCOM_MAKE_STRING(val1, $4));
1682 reset_buffer(&concat_buffer);
1683 safe_buf_append(&concat_buffer, $4);
1684 START(AUTH, $1, $<ctxt>$)
1689 { char* complete = get_buf_string(&concat_buffer);
1690 end_element(ELT_SOUR_AUTH, PARENT, $<ctxt>5,
1691 GEDCOM_MAKE_STRING(val1, complete));
1695 sour_auth_subs : /* empty */
1696 | sour_auth_subs sour_auth_sub
1699 sour_auth_sub : continuation_sub /* 0:M */
1704 sour_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1705 { $<ctxt>$ = start_element(ELT_SOUR_TITL,
1707 GEDCOM_MAKE_STRING(val1, $4));
1708 reset_buffer(&concat_buffer);
1709 safe_buf_append(&concat_buffer, $4);
1710 START(TITL, $1, $<ctxt>$)
1715 { char* complete = get_buf_string(&concat_buffer);
1716 end_element(ELT_SOUR_TITL, PARENT, $<ctxt>5,
1717 GEDCOM_MAKE_STRING(val1, complete));
1721 sour_titl_subs : /* empty */
1722 | sour_titl_subs sour_titl_sub
1725 sour_titl_sub : continuation_sub /* 0:M */
1730 sour_abbr_sect : OPEN DELIM TAG_ABBR mand_line_item
1731 { $<ctxt>$ = start_element(ELT_SOUR_ABBR,
1733 GEDCOM_MAKE_STRING(val1, $4));
1734 START(ABBR, $1, $<ctxt>$)
1739 { end_element(ELT_SOUR_ABBR, PARENT, $<ctxt>5,
1740 GEDCOM_MAKE_NULL(val1));
1745 sour_publ_sect : OPEN DELIM TAG_PUBL mand_line_item
1746 { $<ctxt>$ = start_element(ELT_SOUR_PUBL,
1748 GEDCOM_MAKE_STRING(val1, $4));
1749 reset_buffer(&concat_buffer);
1750 safe_buf_append(&concat_buffer, $4);
1751 START(PUBL, $1, $<ctxt>$)
1756 { char* complete = get_buf_string(&concat_buffer);
1757 end_element(ELT_SOUR_PUBL, PARENT, $<ctxt>5,
1758 GEDCOM_MAKE_STRING(val1, complete));
1762 sour_publ_subs : /* empty */
1763 | sour_publ_subs sour_publ_sub
1766 sour_publ_sub : continuation_sub /* 0:M */
1771 sour_text_sect : OPEN DELIM TAG_TEXT mand_line_item
1772 { $<ctxt>$ = start_element(ELT_SOUR_TEXT,
1774 GEDCOM_MAKE_STRING(val1, $4));
1775 reset_buffer(&concat_buffer);
1776 safe_buf_append(&concat_buffer, $4);
1777 START(TEXT, $1, $<ctxt>$)
1782 { char* complete = get_buf_string(&concat_buffer);
1783 end_element(ELT_SOUR_TEXT, PARENT, $<ctxt>5,
1784 GEDCOM_MAKE_STRING(val1, complete));
1788 sour_text_subs : /* empty */
1789 | sour_text_subs sour_text_sub
1792 sour_text_sub : continuation_sub /* 0:M */
1796 /* Only for compatibility */
1797 sour_type_sect : OPEN DELIM TAG_TYPE opt_line_item
1798 { if (compat_mode(C_NONSTD_SOUR_TAGS)) {
1800 compat_generate_nonstd_sour_start(PARENT, $1, $3, $4,
1805 { if (compat_mode(C_NONSTD_SOUR_TAGS))
1806 compat_generate_nonstd_sour_end(PARENT, $<ctxt>5);
1810 /* Only for compatibility */
1811 sour_file_sect : OPEN DELIM TAG_FILE opt_line_item
1812 { if (compat_mode(C_NONSTD_SOUR_TAGS)) {
1814 compat_generate_nonstd_sour_start(PARENT, $1, $3, $4,
1819 { if (compat_mode(C_NONSTD_SOUR_TAGS))
1820 compat_generate_nonstd_sour_end(PARENT, $<ctxt>5);
1824 /* Only for compatibility */
1825 sour_plac_sect : OPEN DELIM TAG_PLAC opt_line_item
1826 { if (compat_mode(C_NONSTD_SOUR_TAGS)) {
1828 compat_generate_nonstd_sour_start(PARENT, $1, $3, $4,
1833 { if (compat_mode(C_NONSTD_SOUR_TAGS))
1834 compat_generate_nonstd_sour_end(PARENT, $<ctxt>5);
1838 /* Only for compatibility */
1839 sour_date_sect : OPEN DELIM TAG_DATE opt_line_item
1840 { if (compat_mode(C_NONSTD_SOUR_TAGS)) {
1842 compat_generate_nonstd_sour_start(PARENT, $1, $3, $4,
1847 { if (compat_mode(C_NONSTD_SOUR_TAGS))
1848 compat_generate_nonstd_sour_end(PARENT, $<ctxt>5);
1852 /* Only for compatibility */
1853 sour_medi_sect : OPEN DELIM TAG_MEDI opt_line_item
1854 { if (compat_mode(C_NONSTD_SOUR_TAGS)) {
1856 compat_generate_nonstd_sour_start(PARENT, $1, $3, $4,
1861 { if (compat_mode(C_NONSTD_SOUR_TAGS))
1862 compat_generate_nonstd_sour_end(PARENT, $<ctxt>5);
1866 /* Only for compatibility */
1867 sour_page_sect : OPEN DELIM TAG_PAGE opt_line_item
1868 { if (compat_mode(C_NONSTD_SOUR_TAGS)) {
1870 compat_generate_nonstd_sour_start(PARENT, $1, $3, $4,
1875 { if (compat_mode(C_NONSTD_SOUR_TAGS))
1876 compat_generate_nonstd_sour_end(PARENT, $<ctxt>5);
1880 /*********************************************************************/
1881 /**** Submission record ****/
1882 /*********************************************************************/
1883 submis_rec : OPEN DELIM POINTER DELIM TAG_SUBN
1884 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1886 if (xr == NULL) HANDLE_ERROR;
1887 $<ctxt>$ = start_record(REC_SUBN,
1888 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1889 NULL, GEDCOM_MAKE_NULL(val2));
1890 START(SUBN, $1, $<ctxt>$) }
1894 { end_record(REC_SUBN, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1897 subn_subs : /* empty */
1898 | subn_subs subn_sub
1901 subn_sub : subn_subm_sect { OCCUR2(SUBM, 0, 1) }
1902 | subn_famf_sect { OCCUR2(FAMF, 0, 1) }
1903 | subn_temp_sect { OCCUR2(TEMP, 0, 1) }
1904 | subn_ance_sect { OCCUR2(ANCE, 0, 1) }
1905 | subn_desc_sect { OCCUR2(DESC, 0, 1) }
1906 | subn_ordi_sect { OCCUR2(ORDI, 0, 1) }
1907 | subn_rin_sect { OCCUR2(RIN, 0, 1) }
1912 subn_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1913 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1915 if (xr == NULL) HANDLE_ERROR;
1916 $<ctxt>$ = start_element(ELT_SUBN_SUBM,
1918 GEDCOM_MAKE_XREF_PTR(val1, xr));
1919 START(SUBM, $1, $<ctxt>$)
1924 { end_element(ELT_SUBN_SUBM, PARENT, $<ctxt>5,
1925 GEDCOM_MAKE_NULL(val1));
1930 subn_famf_sect : OPEN DELIM TAG_FAMF mand_line_item
1931 { $<ctxt>$ = start_element(ELT_SUBN_FAMF,
1933 GEDCOM_MAKE_STRING(val1, $4));
1934 START(FAMF, $1, $<ctxt>$)
1939 { end_element(ELT_SUBN_FAMF, PARENT, $<ctxt>5,
1940 GEDCOM_MAKE_NULL(val1));
1945 subn_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
1946 { $<ctxt>$ = start_element(ELT_SUBN_TEMP,
1948 GEDCOM_MAKE_STRING(val1, $4));
1949 START(TEMP, $1, $<ctxt>$)
1954 { end_element(ELT_SUBN_TEMP, PARENT, $<ctxt>5,
1955 GEDCOM_MAKE_NULL(val1));
1960 subn_ance_sect : OPEN DELIM TAG_ANCE mand_line_item
1961 { $<ctxt>$ = start_element(ELT_SUBN_ANCE,
1963 GEDCOM_MAKE_STRING(val1, $4));
1964 START(ANCE, $1, $<ctxt>$)
1969 { end_element(ELT_SUBN_ANCE, PARENT, $<ctxt>5,
1970 GEDCOM_MAKE_NULL(val1));
1975 subn_desc_sect : OPEN DELIM TAG_DESC mand_line_item
1976 { $<ctxt>$ = start_element(ELT_SUBN_DESC,
1978 GEDCOM_MAKE_STRING(val1, $4));
1979 START(DESC, $1, $<ctxt>$)
1984 { end_element(ELT_SUBN_DESC, PARENT, $<ctxt>5,
1985 GEDCOM_MAKE_NULL(val1));
1990 subn_ordi_sect : OPEN DELIM TAG_ORDI mand_line_item
1991 { $<ctxt>$ = start_element(ELT_SUBN_ORDI,
1993 GEDCOM_MAKE_STRING(val1, $4));
1994 START(ORDI, $1, $<ctxt>$)
1999 { end_element(ELT_SUBN_ORDI, PARENT, $<ctxt>5,
2000 GEDCOM_MAKE_NULL(val1));
2005 subn_rin_sect : OPEN DELIM TAG_RIN mand_line_item
2006 { $<ctxt>$ = start_element(ELT_SUBN_RIN,
2008 GEDCOM_MAKE_STRING(val1, $4));
2009 START(RIN, $1, $<ctxt>$)
2014 { end_element(ELT_SUBN_RIN, PARENT, $<ctxt>5,
2015 GEDCOM_MAKE_NULL(val1));
2019 /*********************************************************************/
2020 /**** Submitter record ****/
2021 /*********************************************************************/
2022 submit_rec : OPEN DELIM POINTER DELIM TAG_SUBM
2023 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
2025 if (xr == NULL) HANDLE_ERROR;
2026 $<ctxt>$ = start_record(REC_SUBM,
2027 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
2028 NULL, GEDCOM_MAKE_NULL(val2));
2029 START(SUBM, $1, $<ctxt>$) }
2033 { end_record(REC_SUBM, $<ctxt>6, GEDCOM_MAKE_NULL(val1));
2034 if (compat_mode(C_SUBM_CTRY))
2035 compat_free_ctry_parent_context();
2039 subm_subs : /* empty */
2040 | subm_subs subm_sub
2043 subm_sub : subm_name_sect { OCCUR2(NAME, 1, 1) }
2044 | addr_struc_sub /* 0:1 */
2045 | multim_link_sub /* 0:M */
2046 | subm_lang_sect { OCCUR2(LANG, 0, 3) }
2047 | subm_rfn_sect { OCCUR2(RFN, 0, 1) }
2048 | subm_rin_sect { OCCUR2(RIN, 0, 1) }
2049 | change_date_sub /* 0:1 */
2050 | subm_ctry_sect { if (!compat_mode(C_SUBM_CTRY))
2051 INVALID_TAG("CTRY");
2052 OCCUR2(CTRY, 0, 1) }
2057 subm_name_sect : OPEN DELIM TAG_NAME mand_line_item
2058 { $<ctxt>$ = start_element(ELT_SUBM_NAME,
2060 GEDCOM_MAKE_STRING(val1, $4));
2061 START(NAME, $1, $<ctxt>$)
2066 { end_element(ELT_SUBM_NAME, PARENT, $<ctxt>5,
2067 GEDCOM_MAKE_NULL(val1));
2072 subm_lang_sect : OPEN DELIM TAG_LANG mand_line_item
2073 { $<ctxt>$ = start_element(ELT_SUBM_LANG,
2075 GEDCOM_MAKE_STRING(val1, $4));
2076 START(LANG, $1, $<ctxt>$)
2081 { end_element(ELT_SUBM_LANG, PARENT, $<ctxt>5,
2082 GEDCOM_MAKE_NULL(val1));
2087 subm_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
2088 { $<ctxt>$ = start_element(ELT_SUBM_RFN,
2090 GEDCOM_MAKE_STRING(val1, $4));
2091 START(RFN, $1, $<ctxt>$)
2096 { end_element(ELT_SUBM_RFN, PARENT, $<ctxt>5,
2097 GEDCOM_MAKE_NULL(val1));
2102 subm_rin_sect : OPEN DELIM TAG_RIN mand_line_item
2103 { $<ctxt>$ = start_element(ELT_SUBM_RIN,
2105 GEDCOM_MAKE_STRING(val1, $4));
2106 START(RIN, $1, $<ctxt>$)
2111 { end_element(ELT_SUBM_RIN, PARENT, $<ctxt>5,
2112 GEDCOM_MAKE_NULL(val1));
2116 /* SUBM.CTRY (Only for compatibility) */
2117 subm_ctry_sect : OPEN DELIM TAG_CTRY opt_line_item
2118 { if (compat_mode(C_SUBM_CTRY)) {
2119 $<ctxt>$ = compat_generate_addr_ctry_start($1, $3, $4);
2123 { if (compat_mode (C_SUBM_CTRY)) {
2124 compat_generate_addr_ctry_end($<ctxt>5);
2129 /*********************************************************************/
2130 /**** Substructures ****/
2131 /*********************************************************************/
2133 /* ADDRESS STRUCTURE */
2134 addr_struc_sub : addr_sect { OCCUR2(ADDR, 0, 1) }
2135 | phon_sect { OCCUR2(PHON, 0, 3) }
2138 addr_sect : OPEN DELIM TAG_ADDR mand_line_item
2139 { $<ctxt>$ = start_element(ELT_SUB_ADDR,
2141 GEDCOM_MAKE_STRING(val1, $4));
2142 reset_buffer(&concat_buffer);
2143 safe_buf_append(&concat_buffer, $4);
2144 START(ADDR, $1, $<ctxt>$);
2145 if (compat_mode(C_SUBM_CTRY))
2146 compat_save_ctry_parent_context($<ctxt>$);
2151 { char* complete = get_buf_string(&concat_buffer);
2152 end_element(ELT_SUB_ADDR, PARENT, $<ctxt>5,
2153 GEDCOM_MAKE_STRING(val1, complete));
2157 addr_subs : /* empty */
2158 | addr_subs addr_sub
2161 addr_sub : addr_cont_sect /* 0:M */
2162 | addr_adr1_sect { OCCUR2(ADR1, 0, 1) }
2163 | addr_adr2_sect { OCCUR2(ADR2, 0, 1) }
2164 | addr_city_sect { OCCUR2(CITY, 0, 1) }
2165 | addr_stae_sect { OCCUR2(STAE, 0, 1) }
2166 | addr_post_sect { OCCUR2(POST, 0, 1) }
2167 | addr_ctry_sect { OCCUR2(CTRY, 0, 1) }
2171 addr_cont_sect : OPEN DELIM TAG_CONT mand_line_item
2172 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CONT,
2174 GEDCOM_MAKE_STRING(val1, $4));
2175 SAFE_BUF_ADDCHAR(&concat_buffer, '\n');
2176 safe_buf_append(&concat_buffer, $4);
2177 START(CONT, $1, $<ctxt>$)
2182 { end_element(ELT_SUB_ADDR_CONT, PARENT, $<ctxt>5,
2183 GEDCOM_MAKE_NULL(val1));
2186 addr_adr1_sect : OPEN DELIM TAG_ADR1 mand_line_item
2187 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR1,
2189 GEDCOM_MAKE_STRING(val1, $4));
2190 START(ADR1, $1, $<ctxt>$)
2195 { end_element(ELT_SUB_ADDR_ADR1, PARENT, $<ctxt>5,
2196 GEDCOM_MAKE_NULL(val1));
2199 addr_adr2_sect : OPEN DELIM TAG_ADR2 mand_line_item
2200 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR2,
2202 GEDCOM_MAKE_STRING(val1, $4));
2203 START(ADR2, $1, $<ctxt>$)
2208 { end_element(ELT_SUB_ADDR_ADR2, PARENT, $<ctxt>5,
2209 GEDCOM_MAKE_NULL(val1));
2212 addr_city_sect : OPEN DELIM TAG_CITY mand_line_item
2213 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CITY,
2215 GEDCOM_MAKE_STRING(val1, $4));
2216 START(CITY, $1, $<ctxt>$)
2221 { end_element(ELT_SUB_ADDR_CITY, PARENT, $<ctxt>5,
2222 GEDCOM_MAKE_NULL(val1));
2225 addr_stae_sect : OPEN DELIM TAG_STAE mand_line_item
2226 { $<ctxt>$ = start_element(ELT_SUB_ADDR_STAE,
2228 GEDCOM_MAKE_STRING(val1, $4));
2229 START(STAE, $1, $<ctxt>$)
2234 { end_element(ELT_SUB_ADDR_STAE, PARENT, $<ctxt>5,
2235 GEDCOM_MAKE_NULL(val1));
2238 addr_post_sect : OPEN DELIM TAG_POST mand_line_item
2239 { $<ctxt>$ = start_element(ELT_SUB_ADDR_POST,
2241 GEDCOM_MAKE_STRING(val1, $4));
2242 START(POST, $1, $<ctxt>$)
2247 { end_element(ELT_SUB_ADDR_POST, PARENT, $<ctxt>5,
2248 GEDCOM_MAKE_NULL(val1));
2251 addr_ctry_sect : OPEN DELIM TAG_CTRY mand_line_item
2252 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CTRY,
2254 GEDCOM_MAKE_STRING(val1, $4));
2255 START(CTRY, $1, $<ctxt>$)
2260 { end_element(ELT_SUB_ADDR_CTRY, PARENT, $<ctxt>5,
2261 GEDCOM_MAKE_NULL(val1));
2265 phon_sect : OPEN DELIM TAG_PHON mand_line_item
2266 { $<ctxt>$ = start_element(ELT_SUB_PHON,
2268 GEDCOM_MAKE_STRING(val1, $4));
2269 START(PHON, $1, $<ctxt>$)
2274 { end_element(ELT_SUB_PHON, PARENT, $<ctxt>5,
2275 GEDCOM_MAKE_NULL(val1));
2279 /* ASSOCIATION STRUCTURE */
2280 assoc_struc_sub : asso_sect /* 0:M */
2283 asso_sect : OPEN DELIM TAG_ASSO mand_pointer
2284 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2286 if (xr == NULL) HANDLE_ERROR;
2287 $<ctxt>$ = start_element(ELT_SUB_ASSO,
2289 GEDCOM_MAKE_XREF_PTR(val1, xr));
2290 START(ASSO, $1, $<ctxt>$)
2293 { CHECK2(TYPE,RELA) }
2295 { end_element(ELT_SUB_ASSO, PARENT, $<ctxt>5,
2296 GEDCOM_MAKE_NULL(val1));
2300 asso_subs : /* empty */
2301 | asso_type_sect { OCCUR2(TYPE, 1, 1) }
2302 | asso_rela_sect { OCCUR2(RELA, 1, 1) }
2308 asso_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2309 { $<ctxt>$ = start_element(ELT_SUB_ASSO_TYPE,
2311 GEDCOM_MAKE_STRING(val1, $4));
2312 START(TYPE, $1, $<ctxt>$)
2317 { end_element(ELT_SUB_ASSO_TYPE, PARENT, $<ctxt>5,
2318 GEDCOM_MAKE_NULL(val1));
2322 asso_rela_sect : OPEN DELIM TAG_RELA mand_line_item
2323 { $<ctxt>$ = start_element(ELT_SUB_ASSO_RELA,
2325 GEDCOM_MAKE_STRING(val1, $4));
2326 START(RELA, $1, $<ctxt>$)
2331 { end_element(ELT_SUB_ASSO_RELA, PARENT, $<ctxt>5,
2332 GEDCOM_MAKE_NULL(val1));
2337 change_date_sub : change_date_chan_sect { OCCUR2(CHAN, 0, 1) }
2340 change_date_chan_sect : OPEN DELIM TAG_CHAN
2341 { $<ctxt>$ = start_element(ELT_SUB_CHAN,
2342 PARENT, $1, $3, NULL,
2343 GEDCOM_MAKE_NULL(val1));
2344 START(CHAN, $1, $<ctxt>$)
2346 change_date_chan_subs
2349 { end_element(ELT_SUB_CHAN, PARENT, $<ctxt>4,
2350 GEDCOM_MAKE_NULL(val1));
2354 change_date_chan_subs : /* empty */
2355 | change_date_chan_subs change_date_chan_sub
2358 change_date_chan_sub : change_date_date_sect { OCCUR2(DATE, 1, 1) }
2363 change_date_date_sect : OPEN DELIM TAG_DATE mand_line_item
2364 { struct date_value dv = gedcom_parse_date($4);
2365 $<ctxt>$ = start_element(ELT_SUB_CHAN_DATE,
2367 GEDCOM_MAKE_DATE(val1, dv));
2368 START(DATE, $1, $<ctxt>$) }
2369 change_date_date_subs
2372 { end_element(ELT_SUB_CHAN_DATE, PARENT, $<ctxt>5,
2373 GEDCOM_MAKE_NULL(val1));
2377 change_date_date_subs : /* empty */
2378 | change_date_date_subs change_date_date_sub
2381 change_date_date_sub : change_date_date_time_sect { OCCUR2(TIME, 0, 1) }
2385 change_date_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
2387 = start_element(ELT_SUB_CHAN_TIME,
2389 GEDCOM_MAKE_STRING(val1, $4));
2390 START(TIME, $1, $<ctxt>$)
2395 { end_element(ELT_SUB_CHAN_TIME, PARENT, $<ctxt>5,
2396 GEDCOM_MAKE_NULL(val1));
2400 /* CHILD TO FAMILY LINK */
2401 chi_fam_link_sub : famc_sect /* 0:M */
2404 famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2405 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2407 if (xr == NULL) HANDLE_ERROR;
2408 $<ctxt>$ = start_element(ELT_SUB_FAMC,
2410 GEDCOM_MAKE_XREF_PTR(val1, xr));
2411 START(FAMC, $1, $<ctxt>$)
2416 { end_element(ELT_SUB_FAMC, PARENT, $<ctxt>5,
2417 GEDCOM_MAKE_NULL(val1));
2421 famc_subs : /* empty */
2422 | famc_subs famc_sub
2425 famc_sub : famc_pedi_sect /* 0:M */
2430 famc_pedi_sect : OPEN DELIM TAG_PEDI mand_line_item
2431 { $<ctxt>$ = start_element(ELT_SUB_FAMC_PEDI,
2433 GEDCOM_MAKE_STRING(val1, $4));
2434 START(PEDI, $1, $<ctxt>$)
2439 { end_element(ELT_SUB_FAMC_PEDI, PARENT, $<ctxt>5,
2440 GEDCOM_MAKE_NULL(val1));
2444 /* CONTINUATION SUBSECTIONS */
2445 continuation_sub : cont_sect /* 0:M */
2446 | conc_sect /* 0:M */
2449 cont_sect : OPEN DELIM TAG_CONT opt_line_item
2450 { $<ctxt>$ = start_element(ELT_SUB_CONT,
2452 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2453 SAFE_BUF_ADDCHAR(&concat_buffer, '\n');
2454 if (GEDCOM_IS_STRING(&val1))
2455 safe_buf_append(&concat_buffer, $4);
2456 START(CONT, $1, $<ctxt>$)
2461 { end_element(ELT_SUB_CONT, PARENT, $<ctxt>5,
2462 GEDCOM_MAKE_NULL(val1));
2466 conc_sect : OPEN DELIM TAG_CONC mand_line_item
2467 { $<ctxt>$ = start_element(ELT_SUB_CONC,
2469 GEDCOM_MAKE_STRING(val1, $4));
2470 if (compat_mode(C_CONC_NEEDS_SPACE)) {
2471 safe_buf_append(&concat_buffer, " ");
2473 safe_buf_append(&concat_buffer, $4);
2474 START(CONC, $1, $<ctxt>$)
2479 { end_element(ELT_SUB_CONC, PARENT, $<ctxt>5,
2480 GEDCOM_MAKE_NULL(val1));
2484 cont_conc_subs : /* empty */
2485 | cont_conc_subs cont_conc_sub
2488 cont_conc_sub : cont_conc_sour_sect { if (!compat_mode(C_NOTE_CONC_SOUR))
2489 INVALID_TAG("SOUR");
2490 OCCUR2(SOUR, 0, 1) }
2494 /* Only for compatibility */
2495 cont_conc_sour_sect : OPEN DELIM TAG_SOUR DELIM POINTER
2496 { if (compat_mode(C_NOTE_CONC_SOUR)) {
2498 = compat_generate_note_sour_start(GRANDPARENT(1),
2500 if ($<ctxt>$ == (void*)-1) HANDLE_ERROR;
2505 { if (compat_mode(C_NOTE_CONC_SOUR)) {
2506 compat_generate_note_sour_end($<ctxt>6);
2512 event_detail_sub : event_detail_type_sect { OCCUR2(TYPE, 0, 1) }
2513 | event_detail_date_sect { OCCUR2(DATE, 0, 1) }
2516 | event_detail_age_sect { OCCUR2(AGE, 0, 1) }
2517 | event_detail_agnc_sect { OCCUR2(AGNC, 0, 1) }
2518 | event_detail_caus_sect { OCCUR2(CAUS, 0, 1) }
2524 event_detail_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2526 = start_element(ELT_SUB_EVT_TYPE,
2528 GEDCOM_MAKE_STRING(val1, $4));
2529 START(TYPE, $1, $<ctxt>$)
2534 { end_element(ELT_SUB_EVT_TYPE, PARENT, $<ctxt>5,
2535 GEDCOM_MAKE_NULL(val1));
2538 event_detail_date_sect : OPEN DELIM TAG_DATE mand_line_item
2539 { struct date_value dv = gedcom_parse_date($4);
2541 = start_element(ELT_SUB_EVT_DATE,
2543 GEDCOM_MAKE_DATE(val1, dv));
2544 START(DATE, $1, $<ctxt>$)
2549 { end_element(ELT_SUB_EVT_DATE, PARENT, $<ctxt>5,
2550 GEDCOM_MAKE_NULL(val1));
2553 event_detail_age_sect : OPEN DELIM TAG_AGE mand_line_item
2554 { struct age_value age = gedcom_parse_age($4);
2556 = start_element(ELT_SUB_EVT_AGE,
2558 GEDCOM_MAKE_AGE(val1, age));
2559 START(AGE, $1, $<ctxt>$)
2564 { end_element(ELT_SUB_EVT_AGE, PARENT, $<ctxt>5,
2565 GEDCOM_MAKE_NULL(val1));
2568 event_detail_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
2570 = start_element(ELT_SUB_EVT_AGNC,
2572 GEDCOM_MAKE_STRING(val1, $4));
2573 START(AGNC, $1, $<ctxt>$)
2578 { end_element(ELT_SUB_EVT_AGNC, PARENT, $<ctxt>5,
2579 GEDCOM_MAKE_NULL(val1));
2582 event_detail_caus_sect : OPEN DELIM TAG_CAUS mand_line_item
2584 = start_element(ELT_SUB_EVT_CAUS,
2586 GEDCOM_MAKE_STRING(val1, $4));
2587 START(CAUS, $1, $<ctxt>$)
2592 { end_element(ELT_SUB_EVT_CAUS, PARENT, $<ctxt>5,
2593 GEDCOM_MAKE_NULL(val1));
2597 /* FAMILY EVENT STRUCTURE */
2598 fam_event_struc_sub : fam_event_sect
2599 | fam_gen_even_sect /* 0:M */
2602 fam_event_sect : OPEN DELIM fam_event_tag opt_value
2604 = start_element(ELT_SUB_FAM_EVT,
2606 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2607 START2($1, $<ctxt>$);
2612 { end_element(ELT_SUB_FAM_EVT, PARENT, $<ctxt>5,
2613 GEDCOM_MAKE_NULL(val1));
2617 fam_event_tag : TAG_ANUL { $$ = $1; START1(ANUL) }
2618 | TAG_CENS { $$ = $1; START1(CENS) }
2619 | TAG_DIV { $$ = $1; START1(DIV) }
2620 | TAG_DIVF { $$ = $1; START1(DIVF) }
2621 | TAG_ENGA { $$ = $1; START1(ENGA) }
2622 | TAG_MARR { $$ = $1; START1(MARR) }
2623 | TAG_MARB { $$ = $1; START1(MARB) }
2624 | TAG_MARC { $$ = $1; START1(MARC) }
2625 | TAG_MARL { $$ = $1; START1(MARL) }
2626 | TAG_MARS { $$ = $1; START1(MARS) }
2629 fam_event_subs : /* empty */
2630 | fam_event_subs fam_event_sub
2633 fam_event_sub : event_detail_sub
2634 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2635 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2639 fam_even_husb_sect : OPEN DELIM TAG_HUSB
2640 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_HUSB,
2641 PARENT, $1, $3, NULL,
2642 GEDCOM_MAKE_NULL(val1));
2643 START(HUSB, $1, $<ctxt>$)
2648 { end_element(ELT_SUB_FAM_EVT_HUSB, PARENT, $<ctxt>4,
2649 GEDCOM_MAKE_NULL(val1));
2653 fam_even_husb_subs : /* empty */
2654 | fam_even_husb_subs fam_even_husb_sub
2657 fam_even_husb_sub : fam_even_age_sect { OCCUR2(AGE, 1, 1) }
2661 fam_even_age_sect : OPEN DELIM TAG_AGE mand_line_item
2662 { struct age_value age = gedcom_parse_age($4);
2663 $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_AGE,
2665 GEDCOM_MAKE_AGE(val1, age));
2666 START(AGE, $1, $<ctxt>$)
2671 { end_element(ELT_SUB_FAM_EVT_AGE, PARENT, $<ctxt>5,
2672 GEDCOM_MAKE_NULL(val1));
2676 fam_even_wife_sect : OPEN DELIM TAG_WIFE
2677 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_WIFE,
2678 PARENT, $1, $3, NULL,
2679 GEDCOM_MAKE_NULL(val1));
2680 START(WIFE, $1, $<ctxt>$)
2685 { end_element(ELT_SUB_FAM_EVT_WIFE, PARENT, $<ctxt>4,
2686 GEDCOM_MAKE_NULL(val1));
2690 fam_gen_even_sect : OPEN DELIM TAG_EVEN
2691 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_EVEN,
2692 PARENT, $1, $3, NULL,
2693 GEDCOM_MAKE_NULL(val1));
2694 START(EVEN, $1, $<ctxt>$)
2699 { end_element(ELT_SUB_FAM_EVT_EVEN, PARENT, $<ctxt>4,
2700 GEDCOM_MAKE_NULL(val1));
2704 fam_gen_even_subs : /* empty */
2705 | fam_gen_even_subs fam_gen_even_sub
2708 fam_gen_even_sub : event_detail_sub
2709 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2710 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2714 /* IDENTIFICATION STRUCTURE */
2715 ident_struc_sub : ident_refn_sect /* 0:M */
2716 | ident_rin_sect { OCCUR2(RIN, 0, 1) }
2719 ident_refn_sect : OPEN DELIM TAG_REFN mand_line_item
2720 { $<ctxt>$ = start_element(ELT_SUB_IDENT_REFN,
2722 GEDCOM_MAKE_STRING(val1, $4));
2723 START(REFN, $1, $<ctxt>$)
2728 { end_element(ELT_SUB_IDENT_REFN, PARENT, $<ctxt>5,
2729 GEDCOM_MAKE_NULL(val1));
2733 ident_refn_subs : /* empty */
2734 | ident_refn_subs ident_refn_sub
2737 ident_refn_sub : ident_refn_type_sect { OCCUR2(TYPE, 0, 1) }
2741 ident_refn_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2743 = start_element(ELT_SUB_IDENT_REFN_TYPE,
2745 GEDCOM_MAKE_STRING(val1, $4));
2746 START(TYPE, $1, $<ctxt>$)
2751 { end_element(ELT_SUB_IDENT_REFN_TYPE, PARENT, $<ctxt>5,
2752 GEDCOM_MAKE_NULL(val1));
2756 ident_rin_sect : OPEN DELIM TAG_RIN mand_line_item
2757 { $<ctxt>$ = start_element(ELT_SUB_IDENT_RIN,
2759 GEDCOM_MAKE_STRING(val1, $4));
2760 START(RIN, $1, $<ctxt>$)
2765 { end_element(ELT_SUB_IDENT_RIN, PARENT, $<ctxt>5,
2766 GEDCOM_MAKE_NULL(val1));
2770 /* INDIVIDUAL ATTRIBUTE STRUCTURE */
2771 indiv_attr_struc_sub : indiv_attr_sect /* 0:M */
2772 | indiv_resi_sect /* 0:M */
2775 indiv_attr_sect : OPEN DELIM indiv_attr_tag mand_line_item
2776 { $<ctxt>$ = start_element(ELT_SUB_INDIV_ATTR,
2778 GEDCOM_MAKE_STRING(val1, $4));
2779 START2($1, $<ctxt>$);
2781 indiv_attr_event_subs
2784 { end_element(ELT_SUB_INDIV_ATTR, PARENT, $<ctxt>5,
2785 GEDCOM_MAKE_NULL(val1));
2789 indiv_attr_tag : TAG_CAST { $$ = $1; START1(CAST) }
2790 | TAG_DSCR { $$ = $1; START1(DSCR) }
2791 | TAG_EDUC { $$ = $1; START1(EDUC) }
2792 | TAG_IDNO { $$ = $1; START1(IDNO) }
2793 | TAG_NATI { $$ = $1; START1(NATI) }
2794 | TAG_NCHI { $$ = $1; START1(NCHI) }
2795 | TAG_NMR { $$ = $1; START1(NMR) }
2796 | TAG_OCCU { $$ = $1; START1(OCCU) }
2797 | TAG_PROP { $$ = $1; START1(PROP) }
2798 | TAG_RELI { $$ = $1; START1(RELI) }
2799 | TAG_SSN { $$ = $1; START1(SSN) }
2800 | TAG_TITL { $$ = $1; START1(TITL) }
2803 indiv_resi_sect : OPEN DELIM TAG_RESI
2804 { $<ctxt>$ = start_element(ELT_SUB_INDIV_RESI,
2805 PARENT, $1, $3, NULL,
2806 GEDCOM_MAKE_NULL(val1));
2807 START(RESI, $1, $<ctxt>$)
2809 indiv_attr_event_subs
2812 { end_element(ELT_SUB_INDIV_RESI, PARENT, $<ctxt>4,
2813 GEDCOM_MAKE_NULL(val1));
2817 indiv_attr_event_subs : /* empty */
2818 | indiv_attr_event_subs indiv_attr_event_sub
2821 indiv_attr_event_sub : event_detail_sub
2825 /* INDIVIDUAL EVENT STRUCTURE */
2826 indiv_even_struc_sub : indiv_birt_sect
2828 | indiv_adop_sect /* 0:M */
2829 | indiv_even_sect /* 0:M */
2832 indiv_birt_sect : OPEN DELIM indiv_birt_tag opt_value
2834 = start_element(ELT_SUB_INDIV_BIRT,
2836 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2837 START2($1, $<ctxt>$);
2842 { end_element(ELT_SUB_INDIV_BIRT, PARENT, $<ctxt>5,
2843 GEDCOM_MAKE_NULL(val1));
2847 indiv_birt_tag : TAG_BIRT { $$ = $1; START1(BIRT) }
2848 | TAG_CHR { $$ = $1; START1(CHR) }
2851 indiv_birt_subs : /* empty */
2852 | indiv_birt_subs indiv_birt_sub
2855 indiv_birt_sub : event_detail_sub
2856 | indiv_birt_famc_sect { OCCUR2(FAMC,0, 1) }
2860 indiv_birt_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2861 { struct xref_value *xr = gedcom_parse_xref($4,
2864 if (xr == NULL) HANDLE_ERROR;
2866 = start_element(ELT_SUB_INDIV_BIRT_FAMC,
2868 GEDCOM_MAKE_XREF_PTR(val1, xr));
2869 START(FAMC, $1, $<ctxt>$)
2874 { end_element(ELT_SUB_INDIV_BIRT_FAMC, PARENT, $<ctxt>5,
2875 GEDCOM_MAKE_NULL(val1));
2879 indiv_gen_sect : OPEN DELIM indiv_gen_tag opt_value
2881 = start_element(ELT_SUB_INDIV_GEN,
2883 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2884 START2($1, $<ctxt>$);
2889 { end_element(ELT_SUB_INDIV_GEN, PARENT, $<ctxt>5,
2890 GEDCOM_MAKE_NULL(val1));
2894 indiv_gen_tag : TAG_DEAT { $$ = $1; START1(DEAT) }
2895 | TAG_BURI { $$ = $1; START1(BURI) }
2896 | TAG_CREM { $$ = $1; START1(CREM) }
2897 | TAG_BAPM { $$ = $1; START1(BAPM) }
2898 | TAG_BARM { $$ = $1; START1(BARM) }
2899 | TAG_BASM { $$ = $1; START1(BASM) }
2900 | TAG_BLES { $$ = $1; START1(BLES) }
2901 | TAG_CHRA { $$ = $1; START1(CHRA) }
2902 | TAG_CONF { $$ = $1; START1(CONF) }
2903 | TAG_FCOM { $$ = $1; START1(FCOM) }
2904 | TAG_ORDN { $$ = $1; START1(ORDN) }
2905 | TAG_NATU { $$ = $1; START1(NATU) }
2906 | TAG_EMIG { $$ = $1; START1(EMIG) }
2907 | TAG_IMMI { $$ = $1; START1(IMMI) }
2908 | TAG_CENS { $$ = $1; START1(CENS) }
2909 | TAG_PROB { $$ = $1; START1(PROB) }
2910 | TAG_WILL { $$ = $1; START1(WILL) }
2911 | TAG_GRAD { $$ = $1; START1(GRAD) }
2912 | TAG_RETI { $$ = $1; START1(RETI) }
2915 indiv_gen_subs : /* empty */
2916 | indiv_gen_subs indiv_gen_sub
2919 indiv_gen_sub : event_detail_sub
2923 indiv_adop_sect : OPEN DELIM TAG_ADOP opt_value
2925 = start_element(ELT_SUB_INDIV_ADOP,
2927 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2928 START(ADOP, $1, $<ctxt>$) }
2932 { end_element(ELT_SUB_INDIV_ADOP, PARENT, $<ctxt>5,
2933 GEDCOM_MAKE_NULL(val1));
2937 indiv_adop_subs : /* empty */
2938 | indiv_adop_subs indiv_adop_sub
2941 indiv_adop_sub : event_detail_sub
2942 | indiv_adop_famc_sect { OCCUR2(FAMC,0, 1) }
2946 indiv_adop_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2947 { struct xref_value *xr = gedcom_parse_xref($4,
2950 if (xr == NULL) HANDLE_ERROR;
2952 = start_element(ELT_SUB_INDIV_ADOP_FAMC,
2954 GEDCOM_MAKE_XREF_PTR(val1, xr));
2955 START(FAMC, $1, $<ctxt>$) }
2956 indiv_adop_famc_subs
2959 { end_element(ELT_SUB_INDIV_ADOP_FAMC, PARENT, $<ctxt>5,
2960 GEDCOM_MAKE_NULL(val1));
2964 indiv_adop_famc_subs : /* empty */
2965 | indiv_adop_famc_subs indiv_adop_famc_sub
2968 indiv_adop_famc_sub : indiv_adop_famc_adop_sect { OCCUR2(ADOP,0, 1) }
2972 indiv_adop_famc_adop_sect : OPEN DELIM TAG_ADOP mand_line_item
2974 = start_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2976 GEDCOM_MAKE_STRING(val1, $4));
2977 START(ADOP, $1, $<ctxt>$) }
2981 { end_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2983 GEDCOM_MAKE_NULL(val1));
2987 indiv_even_sect : OPEN DELIM TAG_EVEN
2988 { $<ctxt>$ = start_element(ELT_SUB_INDIV_EVEN,
2989 PARENT, $1, $3, NULL,
2990 GEDCOM_MAKE_NULL(val1));
2991 START(EVEN, $1, $<ctxt>$) }
2995 { end_element(ELT_SUB_INDIV_EVEN, PARENT, $<ctxt>4,
2996 GEDCOM_MAKE_NULL(val1));
3000 /* LDS INDIVIDUAL ORDINANCE */
3001 lds_indiv_ord_sub : lio_bapl_sect /* 0:M */
3002 | lio_slgc_sect /* 0:M */
3005 lio_bapl_sect : OPEN DELIM lio_bapl_tag
3006 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL,
3007 PARENT, $1, $3, NULL,
3008 GEDCOM_MAKE_NULL(val1));
3009 START2($1, $<ctxt>$);
3014 { end_element(ELT_SUB_LIO_BAPL, PARENT, $<ctxt>4,
3015 GEDCOM_MAKE_NULL(val1));
3019 lio_bapl_tag : TAG_BAPL { $$ = $1; START1(BAPL) }
3020 | TAG_CONL { $$ = $1; START1(CONL) }
3021 | TAG_ENDL { $$ = $1; START1(ENDL) }
3024 lio_bapl_subs : /* empty */
3025 | lio_bapl_subs lio_bapl_sub
3028 lio_bapl_sub : lio_bapl_stat_sect { OCCUR2(STAT, 0, 1) }
3029 | lio_bapl_date_sect { OCCUR2(DATE, 0, 1) }
3030 | lio_bapl_temp_sect { OCCUR2(TEMP, 0, 1) }
3031 | lio_bapl_plac_sect { OCCUR2(PLAC, 0, 1) }
3037 lio_bapl_stat_sect : OPEN DELIM TAG_STAT mand_line_item
3038 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_STAT,
3040 GEDCOM_MAKE_STRING(val1, $4));
3041 START(STAT, $1, $<ctxt>$)
3046 { end_element(ELT_SUB_LIO_BAPL_STAT, PARENT, $<ctxt>5,
3047 GEDCOM_MAKE_NULL(val1));
3050 lio_bapl_date_sect : OPEN DELIM TAG_DATE mand_line_item
3051 { struct date_value dv = gedcom_parse_date($4);
3052 $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_DATE,
3054 GEDCOM_MAKE_DATE(val1, dv));
3055 START(DATE, $1, $<ctxt>$)
3060 { end_element(ELT_SUB_LIO_BAPL_DATE, PARENT, $<ctxt>5,
3061 GEDCOM_MAKE_NULL(val1));
3064 lio_bapl_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
3065 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_TEMP,
3067 GEDCOM_MAKE_STRING(val1, $4));
3068 START(TEMP, $1, $<ctxt>$)
3073 { end_element(ELT_SUB_LIO_BAPL_TEMP, PARENT, $<ctxt>5,
3074 GEDCOM_MAKE_NULL(val1));
3077 lio_bapl_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
3078 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_PLAC,
3080 GEDCOM_MAKE_STRING(val1, $4));
3081 START(PLAC, $1, $<ctxt>$)
3086 { end_element(ELT_SUB_LIO_BAPL_PLAC, PARENT, $<ctxt>5,
3087 GEDCOM_MAKE_NULL(val1));
3091 lio_slgc_sect : OPEN DELIM TAG_SLGC
3092 { $<ctxt>$ = start_element(ELT_SUB_LIO_SLGC,
3093 PARENT, $1, $3, NULL,
3094 GEDCOM_MAKE_NULL(val1));
3095 START(SLGC, $1, $<ctxt>$)
3098 { if (compat_mode(C_NO_SLGC_FAMC) && ! CHK_COND(FAMC))
3099 compat_generate_slgc_famc_link($<ctxt>4);
3104 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4,
3105 GEDCOM_MAKE_NULL(val1));
3109 lio_slgc_subs : /* empty */
3110 | lio_slgc_subs lio_slgc_sub
3113 lio_slgc_sub : lio_bapl_sub
3114 | lio_slgc_famc_sect { OCCUR2(FAMC, 1, 1) }
3117 lio_slgc_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
3118 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
3120 if (xr == NULL) HANDLE_ERROR;
3122 = start_element(ELT_SUB_LIO_SLGC_FAMC,
3124 GEDCOM_MAKE_XREF_PTR(val1, xr));
3125 START(FAMC, $1, $<ctxt>$)
3130 { end_element(ELT_SUB_LIO_SLGC_FAMC, PARENT, $<ctxt>5,
3131 GEDCOM_MAKE_NULL(val1));
3135 /* LDS SPOUSE SEALING */
3136 lds_spouse_seal_sub : lss_slgs_sect
3139 lss_slgs_sect : OPEN DELIM TAG_SLGS
3140 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS,
3141 PARENT, $1, $3, NULL,
3142 GEDCOM_MAKE_NULL(val1));
3143 START(SLGS, $1, $<ctxt>$) }
3147 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4,
3148 GEDCOM_MAKE_NULL(val1));
3152 lss_slgs_subs : /* empty */
3153 | lss_slgs_subs lss_slgs_sub
3156 lss_slgs_sub : lss_slgs_stat_sect { OCCUR2(STAT, 0, 1) }
3157 | lss_slgs_date_sect { OCCUR2(DATE, 0, 1) }
3158 | lss_slgs_temp_sect { OCCUR2(TEMP, 0, 1) }
3159 | lss_slgs_plac_sect { OCCUR2(PLAC, 0, 1) }
3165 lss_slgs_stat_sect : OPEN DELIM TAG_STAT mand_line_item
3166 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_STAT,
3168 GEDCOM_MAKE_STRING(val1, $4));
3169 START(STAT, $1, $<ctxt>$)
3174 { end_element(ELT_SUB_LSS_SLGS_STAT, PARENT, $<ctxt>5,
3175 GEDCOM_MAKE_NULL(val1));
3178 lss_slgs_date_sect : OPEN DELIM TAG_DATE mand_line_item
3179 { struct date_value dv = gedcom_parse_date($4);
3180 $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_DATE,
3182 GEDCOM_MAKE_DATE(val1, dv));
3183 START(DATE, $1, $<ctxt>$)
3188 { end_element(ELT_SUB_LSS_SLGS_DATE, PARENT, $<ctxt>5,
3189 GEDCOM_MAKE_NULL(val1));
3192 lss_slgs_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
3193 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_TEMP,
3195 GEDCOM_MAKE_STRING(val1, $4));
3196 START(TEMP, $1, $<ctxt>$)
3201 { end_element(ELT_SUB_LSS_SLGS_TEMP, PARENT, $<ctxt>5,
3202 GEDCOM_MAKE_NULL(val1));
3205 lss_slgs_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
3206 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_PLAC,
3208 GEDCOM_MAKE_STRING(val1, $4));
3209 START(PLAC, $1, $<ctxt>$)
3214 { end_element(ELT_SUB_LSS_SLGS_PLAC, PARENT, $<ctxt>5,
3215 GEDCOM_MAKE_NULL(val1));
3219 /* MULTIMEDIA LINK */
3220 multim_link_sub : multim_obje_link_sect
3221 | multim_obje_emb_sect
3224 multim_obje_link_sect : OPEN DELIM TAG_OBJE DELIM POINTER
3225 { struct xref_value *xr = gedcom_parse_xref($5,
3228 if (xr == NULL) HANDLE_ERROR;
3230 = start_element(ELT_SUB_MULTIM_OBJE,
3232 GEDCOM_MAKE_XREF_PTR(val1, xr));
3233 START(OBJE, $1, $<ctxt>$)
3238 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>6,
3239 GEDCOM_MAKE_NULL(val1));
3243 multim_obje_emb_sect : OPEN DELIM TAG_OBJE
3244 { $<ctxt>$ = start_element(ELT_SUB_MULTIM_OBJE,
3245 PARENT, $1, $3, NULL,
3246 GEDCOM_MAKE_NULL(val1));
3247 START(OBJE, $1, $<ctxt>$)
3249 multim_obje_emb_subs
3250 { CHECK2(FORM,FILE) }
3252 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>4,
3253 GEDCOM_MAKE_NULL(val1));
3257 multim_obje_emb_subs : /* empty */
3258 | multim_obje_emb_subs multim_obje_emb_sub
3261 multim_obje_emb_sub : multim_obje_form_sect { OCCUR2(FORM, 1, 1) }
3262 | multim_obje_titl_sect { OCCUR2(TITL, 0, 1) }
3263 | multim_obje_file_sect { OCCUR2(FILE, 1, 1) }
3268 multim_obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
3270 = start_element(ELT_SUB_MULTIM_OBJE_FORM,
3272 GEDCOM_MAKE_STRING(val1, $4));
3273 START(FORM, $1, $<ctxt>$)
3278 { end_element(ELT_SUB_MULTIM_OBJE_FORM,
3280 GEDCOM_MAKE_NULL(val1));
3283 multim_obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
3285 = start_element(ELT_SUB_MULTIM_OBJE_TITL,
3287 GEDCOM_MAKE_STRING(val1, $4));
3288 START(TITL, $1, $<ctxt>$)
3293 { end_element(ELT_SUB_MULTIM_OBJE_TITL,
3295 GEDCOM_MAKE_NULL(val1));
3298 multim_obje_file_sect : OPEN DELIM TAG_FILE mand_line_item
3300 = start_element(ELT_SUB_MULTIM_OBJE_FILE,
3302 GEDCOM_MAKE_STRING(val1, $4));
3303 START(FILE, $1, $<ctxt>$)
3308 { end_element(ELT_SUB_MULTIM_OBJE_FILE,
3310 GEDCOM_MAKE_NULL(val1));
3314 /* NOTE STRUCTURE */
3315 note_struc_sub : note_struc_link_sect /* 0:M */
3316 | note_struc_emb_sect /* 0:M */
3319 note_struc_link_sect : OPEN DELIM TAG_NOTE DELIM POINTER
3320 { struct xref_value *xr = gedcom_parse_xref($5,
3323 if (xr == NULL) HANDLE_ERROR;
3325 = start_element(ELT_SUB_NOTE,
3327 GEDCOM_MAKE_XREF_PTR(val1, xr));
3328 START(NOTE, $1, $<ctxt>$)
3330 note_struc_link_subs
3333 { end_element(ELT_SUB_NOTE, PARENT, $<ctxt>6,
3334 GEDCOM_MAKE_NULL(val1));
3338 note_struc_link_subs : /* empty */
3339 | note_struc_link_subs note_struc_link_sub
3342 note_struc_link_sub : source_cit_sub
3346 note_struc_emb_sect : OPEN DELIM TAG_NOTE opt_line_item
3348 if (compat_mode(C_NOTE_TOO_LONG))
3349 str = compat_long_line_get_prefix($4);
3351 = start_element(ELT_SUB_NOTE,
3352 PARENT, $1, $3, str,
3353 GEDCOM_MAKE_NULL_OR_STRING(val1, str));
3354 reset_buffer(&concat_buffer);
3356 safe_buf_append(&concat_buffer, $4);
3357 START(NOTE, $1, $<ctxt>$);
3358 if (compat_mode(C_NOTE_TOO_LONG))
3359 compat_long_line_finish($<ctxt>$, $1);
3364 { char* complete = get_buf_string(&concat_buffer);
3365 end_element(ELT_SUB_NOTE, PARENT, $<ctxt>5,
3366 GEDCOM_MAKE_STRING(val1, complete));
3370 note_struc_emb_subs : /* empty */
3371 | note_struc_emb_subs note_struc_emb_sub
3374 note_struc_emb_sub : continuation_sub
3379 /* PERSONAL NAME STRUCTURE */
3380 pers_name_struc_sub : pers_name_sect /* 0:M */
3383 pers_name_sect : OPEN DELIM TAG_NAME mand_line_item
3384 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME,
3386 GEDCOM_MAKE_STRING(val1, $4));
3387 START(NAME, $1, $<ctxt>$)
3392 { end_element(ELT_SUB_PERS_NAME, PARENT, $<ctxt>5,
3393 GEDCOM_MAKE_NULL(val1));
3397 pers_name_subs : /* empty */
3398 | pers_name_subs pers_name_sub
3401 pers_name_sub : pers_name_npfx_sect { OCCUR2(NPFX, 0, 1) }
3402 | pers_name_givn_sect { OCCUR2(GIVN, 0, 1) }
3403 | pers_name_nick_sect { OCCUR2(NICK, 0, 1) }
3404 | pers_name_spfx_sect { OCCUR2(SPFX, 0, 1) }
3405 | pers_name_surn_sect { OCCUR2(SURN, 0, 1) }
3406 | pers_name_nsfx_sect { OCCUR2(NSFX, 0, 1) }
3412 pers_name_npfx_sect : OPEN DELIM TAG_NPFX mand_line_item
3413 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NPFX,
3415 GEDCOM_MAKE_STRING(val1, $4));
3416 START(NPFX, $1, $<ctxt>$)
3421 { end_element(ELT_SUB_PERS_NAME_NPFX, PARENT, $<ctxt>5,
3422 GEDCOM_MAKE_NULL(val1));
3425 pers_name_givn_sect : OPEN DELIM TAG_GIVN mand_line_item
3426 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_GIVN,
3428 GEDCOM_MAKE_STRING(val1, $4));
3429 START(GIVN, $1, $<ctxt>$)
3434 { end_element(ELT_SUB_PERS_NAME_GIVN, PARENT, $<ctxt>5,
3435 GEDCOM_MAKE_NULL(val1));
3438 pers_name_nick_sect : OPEN DELIM TAG_NICK mand_line_item
3439 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NICK,
3441 GEDCOM_MAKE_STRING(val1, $4));
3442 START(NICK, $1, $<ctxt>$)
3447 { end_element(ELT_SUB_PERS_NAME_NICK, PARENT, $<ctxt>5,
3448 GEDCOM_MAKE_NULL(val1));
3451 pers_name_spfx_sect : OPEN DELIM TAG_SPFX mand_line_item
3452 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SPFX,
3454 GEDCOM_MAKE_STRING(val1, $4));
3455 START(SPFX, $1, $<ctxt>$)
3460 { end_element(ELT_SUB_PERS_NAME_SPFX, PARENT, $<ctxt>5,
3461 GEDCOM_MAKE_NULL(val1));
3464 pers_name_surn_sect : OPEN DELIM TAG_SURN mand_line_item
3465 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SURN,
3467 GEDCOM_MAKE_STRING(val1, $4));
3468 START(SURN, $1, $<ctxt>$)
3473 { end_element(ELT_SUB_PERS_NAME_SURN, PARENT, $<ctxt>5,
3474 GEDCOM_MAKE_NULL(val1));
3477 pers_name_nsfx_sect : OPEN DELIM TAG_NSFX mand_line_item
3478 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NSFX,
3480 GEDCOM_MAKE_STRING(val1, $4));
3481 START(NSFX, $1, $<ctxt>$)
3486 { end_element(ELT_SUB_PERS_NAME_NSFX, PARENT, $<ctxt>5,
3487 GEDCOM_MAKE_NULL(val1));
3491 /* PLACE STRUCTURE */
3492 place_struc_sub : place_struc_plac_sect /* 0:M */
3495 place_struc_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
3497 = start_element(ELT_SUB_PLAC,
3499 GEDCOM_MAKE_STRING(val1, $4));
3500 START(PLAC, $1, $<ctxt>$)
3502 place_struc_plac_subs
3505 { end_element(ELT_SUB_PLAC, PARENT, $<ctxt>5,
3506 GEDCOM_MAKE_NULL(val1));
3510 place_struc_plac_subs : /* empty */
3511 | place_struc_plac_subs place_struc_plac_sub
3514 place_struc_plac_sub : place_plac_form_sect { OCCUR2(FORM, 0, 1) }
3520 place_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
3522 = start_element(ELT_SUB_PLAC_FORM,
3524 GEDCOM_MAKE_STRING(val1, $4));
3525 START(FORM, $1, $<ctxt>$)
3530 { end_element(ELT_SUB_PLAC_FORM, PARENT, $<ctxt>5,
3531 GEDCOM_MAKE_NULL(val1));
3535 /* SOURCE_CITATION */
3536 source_cit_sub : source_cit_link_sect /* 0:M */
3537 | source_cit_emb_sect /* 0:M */
3540 source_cit_link_sect : OPEN DELIM TAG_SOUR DELIM POINTER
3541 { struct xref_value *xr = gedcom_parse_xref($5,
3544 if (xr == NULL) HANDLE_ERROR;
3546 = start_element(ELT_SUB_SOUR,
3548 GEDCOM_MAKE_XREF_PTR(val1, xr));
3549 START(SOUR, $1, $<ctxt>$)
3551 source_cit_link_subs
3554 { end_element(ELT_SUB_SOUR, PARENT, $<ctxt>6,
3555 GEDCOM_MAKE_NULL(val1));
3559 source_cit_link_subs : /* empty */
3560 | source_cit_link_subs source_cit_link_sub
3563 source_cit_link_sub : source_cit_page_sect { OCCUR2(PAGE, 0, 1) }
3564 | source_cit_even_sect { OCCUR2(EVEN, 0, 1) }
3565 | source_cit_data_sect { OCCUR2(DATA, 0, 1) }
3566 | source_cit_quay_sect { OCCUR2(QUAY, 0, 1) }
3572 source_cit_page_sect : OPEN DELIM TAG_PAGE mand_line_item
3574 = start_element(ELT_SUB_SOUR_PAGE,
3576 GEDCOM_MAKE_STRING(val1, $4));
3577 START(PAGE, $1, $<ctxt>$)
3582 { end_element(ELT_SUB_SOUR_PAGE, PARENT, $<ctxt>5,
3583 GEDCOM_MAKE_NULL(val1));
3587 source_cit_even_sect : OPEN DELIM TAG_EVEN mand_line_item
3589 = start_element(ELT_SUB_SOUR_EVEN,
3591 GEDCOM_MAKE_STRING(val1, $4));
3592 START(EVEN, $1, $<ctxt>$)
3594 source_cit_even_subs
3597 { end_element(ELT_SUB_SOUR_EVEN, PARENT, $<ctxt>5,
3598 GEDCOM_MAKE_NULL(val1));
3602 source_cit_even_subs : /* empty */
3603 | source_cit_even_subs source_cit_even_sub
3606 source_cit_even_sub : source_cit_even_role_sect { OCCUR2(ROLE, 0, 1) }
3610 source_cit_even_role_sect : OPEN DELIM TAG_ROLE mand_line_item
3612 = start_element(ELT_SUB_SOUR_EVEN_ROLE,
3614 GEDCOM_MAKE_STRING(val1, $4));
3615 START(ROLE, $1, $<ctxt>$)
3620 { end_element(ELT_SUB_SOUR_EVEN_ROLE,
3622 GEDCOM_MAKE_NULL(val1));
3626 source_cit_data_sect : OPEN DELIM TAG_DATA
3627 { $<ctxt>$ = start_element(ELT_SUB_SOUR_DATA,
3628 PARENT, $1, $3, NULL,
3629 GEDCOM_MAKE_NULL(val1));
3630 START(DATA, $1, $<ctxt>$)
3632 source_cit_data_subs
3635 { end_element(ELT_SUB_SOUR_DATA, PARENT, $<ctxt>4,
3636 GEDCOM_MAKE_NULL(val1));
3640 source_cit_data_subs : /* empty */
3641 | source_cit_data_subs source_cit_data_sub
3644 source_cit_data_sub : source_cit_data_date_sect { OCCUR2(DATE, 0, 1) }
3645 | source_cit_text_sect /* 0:M */
3649 source_cit_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
3650 { struct date_value dv = gedcom_parse_date($4);
3652 = start_element(ELT_SUB_SOUR_DATA_DATE,
3654 GEDCOM_MAKE_DATE(val1, dv));
3655 START(DATE, $1, $<ctxt>$)
3660 { end_element(ELT_SUB_SOUR_DATA_DATE,
3662 GEDCOM_MAKE_NULL(val1));
3666 source_cit_text_sect : OPEN DELIM TAG_TEXT mand_line_item
3668 = start_element(ELT_SUB_SOUR_TEXT,
3670 GEDCOM_MAKE_STRING(val1, $4));
3671 reset_buffer(&concat_buffer);
3672 safe_buf_append(&concat_buffer, $4);
3673 START(TEXT, $1, $<ctxt>$)
3675 source_cit_text_subs
3678 { char* complete = get_buf_string(&concat_buffer);
3679 end_element(ELT_SUB_SOUR_TEXT, PARENT, $<ctxt>5,
3680 GEDCOM_MAKE_STRING(val1, complete));
3684 source_cit_text_subs : /* empty */
3685 | source_cit_text_subs source_cit_text_sub
3688 source_cit_text_sub : continuation_sub
3692 source_cit_quay_sect : OPEN DELIM TAG_QUAY mand_line_item
3694 = start_element(ELT_SUB_SOUR_QUAY,
3696 GEDCOM_MAKE_STRING(val1, $4));
3697 START(QUAY, $1, $<ctxt>$)
3702 { end_element(ELT_SUB_SOUR_QUAY, PARENT, $<ctxt>5,
3703 GEDCOM_MAKE_NULL(val1));
3707 source_cit_emb_sect : OPEN DELIM TAG_SOUR mand_line_item
3708 { $<ctxt>$ = start_element(ELT_SUB_SOUR,
3710 GEDCOM_MAKE_STRING(val1, $4));
3711 reset_buffer(&concat_buffer);
3712 safe_buf_append(&concat_buffer, $4);
3713 START(SOUR, $1, $<ctxt>$)
3718 { char* complete = get_buf_string(&concat_buffer);
3719 end_element(ELT_SUB_SOUR, PARENT, $<ctxt>5,
3720 GEDCOM_MAKE_STRING(val1, complete));
3724 source_cit_emb_subs : /* empty */
3725 | source_cit_emb_subs source_cit_emb_sub
3728 source_cit_emb_sub : continuation_sub
3729 | source_cit_text_sect /* 0:M */
3734 /* SOURCE REPOSITORY CITATION */
3735 source_repos_cit_sub : source_repos_repo_sect { OCCUR2(REPO, 0, 1) }
3736 | source_repos_repo_txt_sect
3737 { if (!compat_mode(C_NONSTD_SOUR_TAGS))
3738 INVALID_TAG("REPO");
3743 /* Only for compatibility */
3744 source_repos_repo_txt_sect : OPEN DELIM TAG_REPO opt_line_item
3745 { if (compat_mode(C_NONSTD_SOUR_TAGS)) {
3747 compat_generate_nonstd_sour_start(PARENT, $1, $3, $4,
3752 { if (compat_mode(C_NONSTD_SOUR_TAGS))
3753 compat_generate_nonstd_sour_end(PARENT, $<ctxt>5);
3757 source_repos_repo_sect : OPEN DELIM TAG_REPO DELIM POINTER
3758 { struct xref_value *xr
3759 = gedcom_parse_xref($5, XREF_USED, XREF_REPO);
3760 if (xr == NULL) HANDLE_ERROR;
3762 = start_element(ELT_SUB_REPO,
3764 GEDCOM_MAKE_XREF_PTR(val1, xr));
3765 START(REPO, $1, $<ctxt>$);
3767 source_repos_repo_subs
3770 { end_element(ELT_SUB_REPO, PARENT, $<ctxt>6,
3771 GEDCOM_MAKE_NULL(val1));
3775 source_repos_repo_subs : /* empty */
3776 | source_repos_repo_subs source_repos_repo_sub
3779 source_repos_repo_sub : note_struc_sub
3780 | caln_sect /* 0:M */
3784 caln_sect : OPEN DELIM TAG_CALN mand_line_item
3785 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN,
3787 GEDCOM_MAKE_STRING(val1, $4));
3788 START(CALN, $1, $<ctxt>$)
3793 { end_element(ELT_SUB_REPO_CALN, PARENT, $<ctxt>5,
3794 GEDCOM_MAKE_NULL(val1));
3798 caln_subs : /* empty */
3799 | caln_subs caln_sub
3802 caln_sub : caln_medi_sect { OCCUR2(MEDI, 0, 1) }
3806 caln_medi_sect : OPEN DELIM TAG_MEDI mand_line_item
3807 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN_MEDI,
3809 GEDCOM_MAKE_STRING(val1, $4));
3810 START(MEDI, $1, $<ctxt>$)
3815 { end_element(ELT_SUB_REPO_CALN_MEDI, PARENT, $<ctxt>5,
3816 GEDCOM_MAKE_NULL(val1));
3820 /* SPOUSE TO FAMILY LINK */
3821 spou_fam_link_sub : spou_fam_fams_sect /* 0:M */
3824 spou_fam_fams_sect : OPEN DELIM TAG_FAMS mand_pointer
3825 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
3827 if (xr == NULL) HANDLE_ERROR;
3829 = start_element(ELT_SUB_FAMS,
3831 GEDCOM_MAKE_XREF_PTR(val1, xr));
3832 START(FAMS, $1, $<ctxt>$)
3837 { end_element(ELT_SUB_FAMS, PARENT, $<ctxt>5,
3838 GEDCOM_MAKE_NULL(val1));
3842 spou_fam_fams_subs : /* empty */
3843 | spou_fam_fams_subs spou_fam_fams_sub
3846 spou_fam_fams_sub : note_struc_sub
3850 /*********************************************************************/
3852 /*********************************************************************/
3854 no_std_subs : /* empty */
3855 | no_std_subs no_std_sub
3858 no_std_sub : user_sect /* 0:M */
3861 CLOSE { HANDLE_ERROR }
3864 no_std_rec : user_rec /* 0:M */
3867 CLOSE { HANDLE_ERROR }
3870 user_rec : OPEN DELIM opt_xref USERTAG
3871 { if ($4.string[0] != '_') {
3872 if ((compat_mode(C_551_TAGS)
3873 && compat_check_551_tag($4.string, &usertag_buffer))
3875 (compat_mode(C_NONSTD_SOUR_TAGS)
3876 && compat_check_sour_tag($4.string, &usertag_buffer))) {
3877 $4.string = get_buf_string(&usertag_buffer);
3880 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3887 { struct xref_value *xr = NULL;
3889 xr = gedcom_parse_xref($3, XREF_DEFINED, XREF_USER);
3890 if (xr == NULL) HANDLE_ERROR;
3892 $<ctxt>$ = start_record(REC_USER,
3894 GEDCOM_MAKE_NULL_OR_XREF_PTR(val1, xr),
3896 START($4, $1, $<ctxt>$)
3901 { end_record(REC_USER, $<ctxt>7, GEDCOM_MAKE_NULL(val1)); }
3903 user_sect : OPEN DELIM opt_xref USERTAG
3904 { if ($4.string[0] != '_') {
3905 if ((compat_mode(C_551_TAGS)
3906 && compat_check_551_tag($4.string, &usertag_buffer))
3908 (compat_mode(C_SUBM_COMM)
3909 && compat_check_subm_comm($4.string, get_parenttag(0),
3912 (compat_mode(C_NONSTD_SOUR_TAGS)
3913 && compat_check_sour_tag($4.string, &usertag_buffer))) {
3914 $4.string = get_buf_string(&usertag_buffer);
3917 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3924 { $<ctxt>$ = start_element(ELT_USER, PARENT, $1, $4, $6, &val2);
3925 START($4, $1, $<ctxt>$);
3930 { end_element(ELT_USER, PARENT, $<ctxt>7,
3931 GEDCOM_MAKE_NULL(val1));
3932 if (compat_mode(C_SUBM_COMM))
3933 compat_close_subm_comm();
3937 user_sects : /* empty */ { }
3938 | user_sects user_sect { }
3939 | user_sects gen_sect
3940 { if (compat_mode(C_SUBM_COMM)) {
3943 gedcom_error(_("Standard tag not allowed in user section"));
3949 opt_xref : /* empty */ { $$ = NULL; }
3950 | POINTER DELIM { $$ = $1; }
3953 opt_value : /* empty */ { GEDCOM_MAKE_NULL(val2);
3955 | DELIM POINTER { struct xref_value *xr
3956 = gedcom_parse_xref($2, XREF_USED,
3958 GEDCOM_MAKE_XREF_PTR(val2, xr);
3960 | DELIM line_item { GEDCOM_MAKE_STRING(val2, $2);
3964 mand_pointer : /* empty */ { gedcom_error(_("Missing pointer")); YYERROR; }
3965 | DELIM POINTER { gedcom_debug_print("==Ptr: %s==", $2);
3969 mand_line_item : /* empty */
3970 { if (compat_mode(C_NO_REQUIRED_VALUES)) {
3971 gedcom_debug_print("==Val: ==");
3972 $$ = VALUE_IF_MISSING;
3975 gedcom_error(_("Missing value")); YYERROR;
3978 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3982 opt_line_item : /* empty */ { $$ = NULL; }
3983 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3987 line_item : anychar { size_t i;
3988 reset_buffer(&line_item_buffer);
3989 /* The following also takes care of '@@' */
3990 if (!strncmp($1, "@@", 3))
3991 SAFE_BUF_ADDCHAR(&line_item_buffer, '@')
3993 for (i=0; i < strlen($1); i++)
3994 SAFE_BUF_ADDCHAR(&line_item_buffer, $1[i])
3995 $$ = get_buf_string(&line_item_buffer);
3997 | ESCAPE { size_t i;
3998 reset_buffer(&line_item_buffer);
3999 for (i=0; i < strlen($1); i++)
4000 SAFE_BUF_ADDCHAR(&line_item_buffer, $1[i])
4001 $$ = get_buf_string(&line_item_buffer);
4005 /* The following also takes care of '@@' */
4006 if (!strncmp($2, "@@", 3))
4007 SAFE_BUF_ADDCHAR(&line_item_buffer, '@')
4009 for (i=0; i < strlen($2); i++)
4010 SAFE_BUF_ADDCHAR(&line_item_buffer, $2[i])
4011 $$ = get_buf_string(&line_item_buffer);
4015 for (i=0; i < strlen($2); i++)
4016 SAFE_BUF_ADDCHAR(&line_item_buffer, $2[i])
4017 $$ = get_buf_string(&line_item_buffer);
4019 | line_item error anychar { HANDLE_ERROR; }
4020 | line_item error ESCAPE { HANDLE_ERROR; }
4023 anychar : ANYCHAR { }
4027 error_subs : /* empty */
4028 | error_subs error_sect
4031 error_sect : OPEN DELIM opt_xref anytag opt_value error_subs CLOSE { }
4034 gen_sect : OPEN DELIM opt_xref anystdtag
4035 { if (compat_mode(C_SUBM_COMM)
4036 && compat_check_subm_comm_cont($4.string)) {
4037 /* Will pass here */
4040 INVALID_TAG($4.string);
4044 { if (compat_mode(C_SUBM_COMM)) {
4045 $<ctxt>$ = compat_subm_comm_cont_start(PARENT, $6);
4049 { if (compat_mode(C_SUBM_COMM))
4050 compat_subm_comm_cont_end(PARENT, $<ctxt>7);
4054 gen_rec : gen_rec_top
4058 gen_rec_norm : OPEN DELIM opt_xref anystdtag
4059 { INVALID_TOP_TAG($4.string) }
4060 opt_value opt_sects CLOSE
4064 gen_rec_top : OPEN DELIM anytoptag
4065 { gedcom_error(_("Missing cross-reference")); YYERROR; }
4066 opt_value opt_sects CLOSE
4070 opt_sects : /* empty */ { }
4071 | opt_sects gen_sect { }
4074 anytag : USERTAG { }
4088 anystdtag : TAG_ABBR
4219 /* Functions that handle the counting of subtags */
4221 int* count_arrays[MAXGEDCLEVEL+1];
4222 char tag_stack[MAXGEDCLEVEL+1][MAXSTDTAGLEN+1];
4223 Gedcom_ctxt ctxt_stack[MAXGEDCLEVEL+1];
4225 void push_countarray(int level)
4228 gedcom_debug_print("Push Count level: %d, level: %d", count_level, level);
4229 if (count_level != level + 1) {
4230 gedcom_error(_("Internal error: count level mismatch"));
4233 if (count_level > MAXGEDCLEVEL) {
4234 gedcom_error(_("Internal error: count array overflow"));
4238 gedcom_debug_print("calloc countarray %d", count_level);
4239 count = (int *)calloc(YYNTOKENS, sizeof(int));
4240 if (count == NULL) {
4241 gedcom_error(_("Internal error: count array calloc error"));
4245 count_arrays[count_level] = count;
4250 void set_parenttag(const char* tag)
4252 strncpy(tag_stack[count_level+1], tag, MAXSTDTAGLEN+1);
4255 void set_parentctxt(Gedcom_ctxt ctxt)
4257 ctxt_stack[count_level+1] = ctxt;
4260 char* get_parenttag(int offset)
4262 return tag_stack[count_level - offset];
4265 Gedcom_ctxt get_parentctxt(int offset)
4267 return ctxt_stack[count_level - offset];
4270 int count_tag(int tag)
4272 int *count = count_arrays[count_level];
4273 return ++count[tag - GEDCOMTAGOFFSET];
4276 int check_occurrence(int tag)
4278 int *count = count_arrays[count_level];
4279 return (count[tag - GEDCOMTAGOFFSET] > 0);
4282 void pop_countarray()
4285 gedcom_debug_print("Pop Count level: %d", count_level);
4286 if (count_level < 0) {
4287 gedcom_error(_("Internal error: count array underflow"));
4291 count = count_arrays[count_level];
4292 gedcom_debug_print("free countarray %d", count_level);
4294 count_arrays[count_level] = NULL;
4300 gedcom_debug_print("Cleanup countarrays");
4301 while (count_level > 0) {
4307 void cleanup_concat_buffer()
4309 cleanup_buffer(&concat_buffer);
4312 void cleanup_line_item_buffer()
4314 cleanup_buffer(&line_item_buffer);
4317 void cleanup_usertag_buffer()
4319 cleanup_buffer(&usertag_buffer);
4322 /* Enabling debug mode */
4323 /* level 0: no debugging */
4324 /* level 1: only internal */
4325 /* level 2: also bison */
4328 void gedcom_set_debug_level(int level, FILE* f)
4333 trace_output = stderr;
4335 gedcom_high_level_debug = 1;
4344 int gedcom_debug_print(const char* s, ...)
4347 if (gedcom_high_level_debug) {
4350 res = vfprintf(trace_output, s, ap);
4352 fprintf(trace_output, "\n");