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) { \
190 else if (error_mechanism == IGNORE_ERRORS) { \
194 #define START1(PARENTTAG) \
195 { set_parenttag(#PARENTTAG); \
197 #define START2(LEVEL,PARENTCTXT) \
198 { set_parentctxt(PARENTCTXT); \
200 push_countarray(LEVEL); \
202 #define START(PARENTTAG,LEVEL,PARENTCTXT) \
203 { START1(PARENTTAG); \
204 START2(LEVEL,PARENTCTXT); \
208 #define GRANDPARENT(OFF) \
211 { if (!check_occurrence(TAG_##TAG)) { \
212 char* parenttag = get_parenttag(0); \
213 gedcom_error(_("The tag '%s' is mandatory within '%s', but missing"),\
218 #define CHK_COND(TAG) \
219 check_occurrence(TAG_##TAG)
221 { pop_countarray(); \
225 #define CHECK1(TAG1) { CHK(TAG1); POP; }
226 #define CHECK2(TAG1,TAG2) \
227 { CHK(TAG1); CHK(TAG2); POP; }
228 #define CHECK3(TAG1,TAG2,TAG3) \
229 { CHK(TAG1); CHK(TAG2); CHK(TAG3); POP; }
230 #define CHECK4(TAG1,TAG2,TAG3,TAG4) \
231 { CHK(TAG1); CHK(TAG2); CHK(TAG3); CHK(TAG4); POP; }
232 #define OCCUR1(CHILDTAG, MIN) { count_tag(TAG_##CHILDTAG); }
233 #define OCCUR2(CHILDTAG, MIN, MAX) \
234 { int num = count_tag(TAG_##CHILDTAG); \
236 char* parenttag = get_parenttag(0); \
237 gedcom_error(_("The tag '%s' can maximally occur %d time(s) within '%s'"), \
238 #CHILDTAG, MAX, parenttag); \
242 #define INVALID_TAG(CHILDTAG) \
243 { char* parenttag = get_parenttag(0); \
244 gedcom_error(_("The tag '%s' is not a valid tag within '%s'"), \
245 CHILDTAG, parenttag); \
248 #define INVALID_TOP_TAG(CHILDTAG) \
249 { gedcom_error(_("The tag '%s' is not a valid top-level tag"), \
259 struct tag_struct tag;
266 %token <string> BADTOKEN
268 %token <string> CLOSE
269 %token <string> ESCAPE
270 %token <string> DELIM
271 %token <string> ANYCHAR
272 %token <string> POINTER
274 %token <tag> TAG_ABBR
275 %token <tag> TAG_ADDR
276 %token <tag> TAG_ADR1
277 %token <tag> TAG_ADR2
278 %token <tag> TAG_ADOP
281 %token <tag> TAG_AGNC
282 %token <tag> TAG_ALIA
283 %token <tag> TAG_ANCE
284 %token <tag> TAG_ANCI
285 %token <tag> TAG_ANUL
286 %token <tag> TAG_ASSO
287 %token <tag> TAG_AUTH
288 %token <tag> TAG_BAPL
289 %token <tag> TAG_BAPM
290 %token <tag> TAG_BARM
291 %token <tag> TAG_BASM
292 %token <tag> TAG_BIRT
293 %token <tag> TAG_BLES
294 %token <tag> TAG_BLOB
295 %token <tag> TAG_BURI
296 %token <tag> TAG_CALN
297 %token <tag> TAG_CAST
298 %token <tag> TAG_CAUS
299 %token <tag> TAG_CENS
300 %token <tag> TAG_CHAN
301 %token <tag> TAG_CHAR
302 %token <tag> TAG_CHIL
304 %token <tag> TAG_CHRA
305 %token <tag> TAG_CITY
306 %token <tag> TAG_CONC
307 %token <tag> TAG_CONF
308 %token <tag> TAG_CONL
309 %token <tag> TAG_CONT
310 %token <tag> TAG_COPR
311 %token <tag> TAG_CORP
312 %token <tag> TAG_CREM
313 %token <tag> TAG_CTRY
314 %token <tag> TAG_DATA
315 %token <tag> TAG_DATE
316 %token <tag> TAG_DEAT
317 %token <tag> TAG_DESC
318 %token <tag> TAG_DESI
319 %token <tag> TAG_DEST
321 %token <tag> TAG_DIVF
322 %token <tag> TAG_DSCR
323 %token <tag> TAG_EDUC
324 %token <tag> TAG_EMIG
325 %token <tag> TAG_ENDL
326 %token <tag> TAG_ENGA
327 %token <tag> TAG_EVEN
329 %token <tag> TAG_FAMC
330 %token <tag> TAG_FAMF
331 %token <tag> TAG_FAMS
332 %token <tag> TAG_FCOM
333 %token <tag> TAG_FILE
334 %token <tag> TAG_FORM
335 %token <tag> TAG_GEDC
336 %token <tag> TAG_GIVN
337 %token <tag> TAG_GRAD
338 %token <tag> TAG_HEAD
339 %token <tag> TAG_HUSB
340 %token <tag> TAG_IDNO
341 %token <tag> TAG_IMMI
342 %token <tag> TAG_INDI
343 %token <tag> TAG_LANG
344 %token <tag> TAG_LEGA
345 %token <tag> TAG_MARB
346 %token <tag> TAG_MARC
347 %token <tag> TAG_MARL
348 %token <tag> TAG_MARR
349 %token <tag> TAG_MARS
350 %token <tag> TAG_MEDI
351 %token <tag> TAG_NAME
352 %token <tag> TAG_NATI
353 %token <tag> TAG_NATU
354 %token <tag> TAG_NCHI
355 %token <tag> TAG_NICK
357 %token <tag> TAG_NOTE
358 %token <tag> TAG_NPFX
359 %token <tag> TAG_NSFX
360 %token <tag> TAG_OBJE
361 %token <tag> TAG_OCCU
362 %token <tag> TAG_ORDI
363 %token <tag> TAG_ORDN
364 %token <tag> TAG_PAGE
365 %token <tag> TAG_PEDI
366 %token <tag> TAG_PHON
367 %token <tag> TAG_PLAC
368 %token <tag> TAG_POST
369 %token <tag> TAG_PROB
370 %token <tag> TAG_PROP
371 %token <tag> TAG_PUBL
372 %token <tag> TAG_QUAY
373 %token <tag> TAG_REFN
374 %token <tag> TAG_RELA
375 %token <tag> TAG_RELI
376 %token <tag> TAG_REPO
377 %token <tag> TAG_RESI
378 %token <tag> TAG_RESN
379 %token <tag> TAG_RETI
382 %token <tag> TAG_ROLE
384 %token <tag> TAG_SLGC
385 %token <tag> TAG_SLGS
386 %token <tag> TAG_SOUR
387 %token <tag> TAG_SPFX
389 %token <tag> TAG_STAE
390 %token <tag> TAG_STAT
391 %token <tag> TAG_SUBM
392 %token <tag> TAG_SUBN
393 %token <tag> TAG_SURN
394 %token <tag> TAG_TEMP
395 %token <tag> TAG_TEXT
396 %token <tag> TAG_TIME
397 %token <tag> TAG_TITL
398 %token <tag> TAG_TRLR
399 %token <tag> TAG_TYPE
400 %token <tag> TAG_VERS
401 %token <tag> TAG_WIFE
402 %token <tag> TAG_WILL
404 %type <tag> anystdtag
405 %type <tag> anytoptag
406 %type <tag> fam_event_tag
407 %type <tag> indiv_attr_tag
408 %type <tag> indiv_birt_tag
409 %type <tag> indiv_gen_tag
410 %type <tag> lio_bapl_tag
411 %type <string> line_item
412 %type <string> mand_line_item
413 %type <string> mand_pointer
414 %type <string> note_line_item
415 %type <string> anychar
416 %type <string> opt_xref
417 %type <string> opt_value
418 %type <string> opt_line_item
419 %type <ctxt> head_sect
423 file : head_sect records trlr_sect
424 { if (fail == 1) YYABORT; }
429 records : /* empty */
444 /*********************************************************************/
446 /*********************************************************************/
447 head_sect : OPEN DELIM TAG_HEAD
448 { $<ctxt>$ = start_record(REC_HEAD, $1, GEDCOM_MAKE_NULL(val1),
450 NULL, GEDCOM_MAKE_NULL(val2));
451 START(HEAD, $1, $<ctxt>$) }
453 { if (compat_mode(C_NO_SUBMITTER) && ! CHK_COND(SUBM))
454 compat_generate_submitter_link($<ctxt>4);
457 if (compat_mode(C_NO_GEDC) && ! CHK_COND(GEDC))
458 compat_generate_gedcom($<ctxt>4);
461 if (compat_mode(C_NO_CHAR) && ! CHK_COND(CHAR)) {
462 if (compat_generate_char($<ctxt>4)) HANDLE_ERROR;
469 { end_record(REC_HEAD, $<ctxt>4, GEDCOM_MAKE_NULL(val1));
470 if (compat_mode(C_NO_SUBMITTER))
471 compat_generate_submitter();
475 head_subs : /* empty */
479 head_sub : head_sour_sect { OCCUR2(SOUR, 1, 1) }
480 | head_dest_sect { OCCUR2(DEST, 0, 1) }
481 | head_date_sect { OCCUR2(DATE, 0, 1) }
482 | head_time_sect { if (!compat_mode(C_HEAD_TIME))
485 | head_subm_sect { OCCUR2(SUBM, 1, 1) }
486 | head_subn_sect { OCCUR2(SUBN, 0, 1) }
487 | head_file_sect { OCCUR2(FILE, 0, 1) }
488 | head_copr_sect { OCCUR2(COPR, 0, 1) }
489 | head_gedc_sect { OCCUR2(GEDC, 1, 1) }
490 | head_char_sect { OCCUR2(CHAR, 1, 1) }
491 | head_lang_sect { OCCUR2(LANG, 0, 1) }
492 | head_plac_sect { OCCUR2(PLAC, 0, 1) }
493 | head_note_sect { OCCUR2(NOTE, 0, 1) }
498 head_sour_sect : OPEN DELIM TAG_SOUR mand_line_item
499 { set_compatibility_program($4);
500 $<ctxt>$ = start_element(ELT_HEAD_SOUR, PARENT,
502 GEDCOM_MAKE_STRING(val1, $4));
503 START(SOUR, $1, $<ctxt>$)
508 { compute_compatibility();
509 end_element(ELT_HEAD_SOUR, PARENT, $<ctxt>5,
510 GEDCOM_MAKE_NULL(val1)); }
513 head_sour_subs : /* empty */
514 | head_sour_subs head_sour_sub
517 head_sour_sub : head_sour_vers_sect { OCCUR2(VERS, 0, 1) }
518 | head_sour_name_sect { OCCUR2(NAME, 0, 1) }
519 | head_sour_corp_sect { OCCUR2(CORP, 0, 1) }
520 | head_sour_data_sect { OCCUR2(DATA, 0, 1) }
524 head_sour_vers_sect : OPEN DELIM TAG_VERS mand_line_item
525 { set_compatibility_version($4);
526 $<ctxt>$ = start_element(ELT_HEAD_SOUR_VERS, PARENT,
528 GEDCOM_MAKE_STRING(val1, $4));
529 START(VERS, $1, $<ctxt>$)
534 { end_element(ELT_HEAD_SOUR_VERS,
535 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
538 head_sour_name_sect : OPEN DELIM TAG_NAME mand_line_item
539 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_NAME, PARENT,
541 GEDCOM_MAKE_STRING(val1, $4));
542 START(NAME, $1, $<ctxt>$)
547 { end_element(ELT_HEAD_SOUR_NAME,
548 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
551 head_sour_corp_sect : OPEN DELIM TAG_CORP mand_line_item
552 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_CORP, PARENT,
554 GEDCOM_MAKE_STRING(val1, $4));
555 START(CORP, $1, $<ctxt>$)
560 { end_element(ELT_HEAD_SOUR_CORP,
561 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
565 head_sour_corp_subs : /* empty */
566 | head_sour_corp_subs head_sour_corp_sub
569 head_sour_corp_sub : addr_struc_sub /* 0:1 */
573 head_sour_data_sect : OPEN DELIM TAG_DATA mand_line_item
574 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_DATA, PARENT,
576 GEDCOM_MAKE_STRING(val1, $4));
577 START(DATA, $1, $<ctxt>$)
582 { end_element(ELT_HEAD_SOUR_DATA,
583 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
587 head_sour_data_subs : /* empty */
588 | head_sour_data_subs head_sour_data_sub
591 head_sour_data_sub : head_sour_data_date_sect { OCCUR2(DATE, 0, 1) }
592 | head_sour_data_copr_sect { OCCUR2(COPR, 0, 1) }
596 head_sour_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
597 { struct date_value dv = gedcom_parse_date($4);
599 = start_element(ELT_HEAD_SOUR_DATA_DATE,
601 GEDCOM_MAKE_DATE(val1, dv));
602 START(DATE, $1, $<ctxt>$)
607 { end_element(ELT_HEAD_SOUR_DATA_DATE,
609 GEDCOM_MAKE_NULL(val1));
612 head_sour_data_copr_sect : OPEN DELIM TAG_COPR mand_line_item
614 = start_element(ELT_HEAD_SOUR_DATA_COPR,
616 GEDCOM_MAKE_STRING(val1, $4));
617 START(COPR, $1, $<ctxt>$)
622 { end_element(ELT_HEAD_SOUR_DATA_COPR,
624 GEDCOM_MAKE_NULL(val1));
629 head_dest_sect : OPEN DELIM TAG_DEST mand_line_item
630 { $<ctxt>$ = start_element(ELT_HEAD_DEST,
632 GEDCOM_MAKE_STRING(val1, $4));
633 START(DEST, $1, $<ctxt>$)
638 { end_element(ELT_HEAD_DEST,
639 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
644 head_date_sect : OPEN DELIM TAG_DATE mand_line_item
645 { struct date_value dv = gedcom_parse_date($4);
646 $<ctxt>$ = start_element(ELT_HEAD_DATE,
648 GEDCOM_MAKE_DATE(val1, dv));
649 START(DATE, $1, $<ctxt>$)
654 { end_element(ELT_HEAD_DATE,
655 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
659 head_date_subs : /* empty */
660 | head_date_subs head_date_sub
663 head_date_sub : head_date_time_sect { OCCUR2(TIME, 0, 1) }
667 head_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
668 { $<ctxt>$ = start_element(ELT_HEAD_DATE_TIME,
670 GEDCOM_MAKE_STRING(val1, $4));
671 START(TIME, $1, $<ctxt>$)
676 { end_element(ELT_HEAD_DATE_TIME,
677 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
681 /* HEAD.TIME (Only for compatibility) */
682 /* Just ignore the time... */
683 head_time_sect : OPEN DELIM TAG_TIME opt_line_item CLOSE
684 { gedcom_warning(_("Header change time lost in the compatibility"));
689 head_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
690 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
692 if (xr == NULL) HANDLE_ERROR;
693 $<ctxt>$ = start_element(ELT_HEAD_SUBM,
695 GEDCOM_MAKE_XREF_PTR(val1, xr));
696 START(SUBM, $1, $<ctxt>$)
701 { end_element(ELT_HEAD_SUBM,
702 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
706 head_subn_sect : OPEN DELIM TAG_SUBN mand_pointer
707 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
709 if (xr == NULL) HANDLE_ERROR;
710 $<ctxt>$ = start_element(ELT_HEAD_SUBN,
712 GEDCOM_MAKE_XREF_PTR(val1, xr));
713 START(SUBN, $1, $<ctxt>$)
718 { end_element(ELT_HEAD_SUBN,
719 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
723 head_file_sect : OPEN DELIM TAG_FILE mand_line_item
724 { $<ctxt>$ = start_element(ELT_HEAD_FILE,
726 GEDCOM_MAKE_STRING(val1, $4));
727 START(FILE, $1, $<ctxt>$)
732 { end_element(ELT_HEAD_FILE, PARENT, $<ctxt>5,
733 GEDCOM_MAKE_NULL(val1));
737 head_copr_sect : OPEN DELIM TAG_COPR mand_line_item
738 { $<ctxt>$ = start_element(ELT_HEAD_COPR,
740 GEDCOM_MAKE_STRING(val1, $4));
741 START(COPR, $1, $<ctxt>$)
746 { end_element(ELT_HEAD_COPR, PARENT, $<ctxt>5,
747 GEDCOM_MAKE_NULL(val1));
751 head_gedc_sect : OPEN DELIM TAG_GEDC
752 { $<ctxt>$ = start_element(ELT_HEAD_GEDC,
753 PARENT, $1, $3, NULL,
754 GEDCOM_MAKE_NULL(val1));
755 START(GEDC, $1, $<ctxt>$)
758 { CHECK2(VERS, FORM) }
760 { end_element(ELT_HEAD_GEDC, PARENT, $<ctxt>4,
761 GEDCOM_MAKE_NULL(val1));
765 head_gedc_subs : /* empty */
766 | head_gedc_subs head_gedc_sub
769 head_gedc_sub : head_gedc_vers_sect { OCCUR2(VERS, 1, 1) }
770 | head_gedc_form_sect { OCCUR2(FORM, 1, 1) }
773 head_gedc_vers_sect : OPEN DELIM TAG_VERS mand_line_item
774 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_VERS,
776 GEDCOM_MAKE_STRING(val1, $4));
777 START(VERS, $1, $<ctxt>$)
782 { end_element(ELT_HEAD_GEDC_VERS,
783 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
786 head_gedc_form_sect : OPEN DELIM TAG_FORM mand_line_item
787 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_FORM,
789 GEDCOM_MAKE_STRING(val1, $4));
790 START(FORM, $1, $<ctxt>$)
795 { end_element(ELT_HEAD_GEDC_FORM,
796 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
801 head_char_sect : OPEN DELIM TAG_CHAR mand_line_item
802 { /* Don't allow to continue if conversion context couldn't
804 if (open_conv_to_internal($4) == 0) HANDLE_ERROR;
805 $<ctxt>$ = start_element(ELT_HEAD_CHAR,
807 GEDCOM_MAKE_STRING(val1, $4));
808 START(CHAR, $1, $<ctxt>$)
813 { end_element(ELT_HEAD_CHAR, PARENT, $<ctxt>5,
814 GEDCOM_MAKE_NULL(val1));
818 head_char_subs : /* empty */
819 | head_char_subs head_char_sub
822 head_char_sub : head_char_vers_sect { OCCUR2(VERS, 0, 1) }
825 head_char_vers_sect : OPEN DELIM TAG_VERS mand_line_item
826 { $<ctxt>$ = start_element(ELT_HEAD_CHAR_VERS,
828 GEDCOM_MAKE_STRING(val1, $4));
829 START(VERS, $1, $<ctxt>$)
834 { end_element(ELT_HEAD_CHAR_VERS,
835 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
840 head_lang_sect : OPEN DELIM TAG_LANG mand_line_item
841 { $<ctxt>$ = start_element(ELT_HEAD_LANG,
843 GEDCOM_MAKE_STRING(val1, $4));
844 START(LANG, $1, $<ctxt>$)
849 { end_element(ELT_HEAD_LANG, PARENT, $<ctxt>5,
850 GEDCOM_MAKE_NULL(val1));
854 head_plac_sect : OPEN DELIM TAG_PLAC
855 { $<ctxt>$ = start_element(ELT_HEAD_PLAC,
856 PARENT, $1, $3, NULL,
857 GEDCOM_MAKE_NULL(val1));
858 START(PLAC, $1, $<ctxt>$)
863 { end_element(ELT_HEAD_PLAC, PARENT, $<ctxt>4,
864 GEDCOM_MAKE_NULL(val1));
868 head_plac_subs : /* empty */
869 | head_plac_subs head_plac_sub
872 head_plac_sub : head_plac_form_sect { OCCUR2(FORM, 1, 1) }
875 head_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
876 { $<ctxt>$ = start_element(ELT_HEAD_PLAC_FORM,
878 GEDCOM_MAKE_STRING(val1, $4));
879 START(FORM, $1, $<ctxt>$)
884 { end_element(ELT_HEAD_PLAC_FORM,
885 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
890 head_note_sect : OPEN DELIM TAG_NOTE mand_line_item
891 { $<ctxt>$ = start_element(ELT_HEAD_NOTE,
893 GEDCOM_MAKE_STRING(val1, $4));
894 reset_buffer(&concat_buffer);
895 safe_buf_append(&concat_buffer, $4);
896 START(NOTE, $1, $<ctxt>$)
901 { char* complete = get_buf_string(&concat_buffer);
902 end_element(ELT_HEAD_NOTE, PARENT, $<ctxt>5,
903 GEDCOM_MAKE_STRING(val1, complete));
907 head_note_subs : /* empty */
908 | head_note_subs head_note_sub
911 head_note_sub : continuation_sub /* 0:M */
915 /*********************************************************************/
917 /*********************************************************************/
918 /* Don't need callbacks here, there is no information... */
919 trlr_sect : OPEN DELIM TAG_TRLR CLOSE { }
922 /*********************************************************************/
923 /**** Family record ****/
924 /*********************************************************************/
925 fam_rec : OPEN DELIM POINTER DELIM TAG_FAM
926 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
928 if (xr == NULL) HANDLE_ERROR;
929 $<ctxt>$ = start_record(REC_FAM,
930 $1, GEDCOM_MAKE_XREF_PTR(val1, xr),
932 NULL, GEDCOM_MAKE_NULL(val2));
933 START(FAM, $1, $<ctxt>$) }
937 { end_record(REC_FAM, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
940 fam_subs : /* empty */
944 fam_sub : fam_event_struc_sub /* 0:M */
945 | fam_husb_sect { OCCUR2(HUSB, 0, 1) }
946 | fam_wife_sect { OCCUR2(WIFE, 0, 1) }
947 | fam_chil_sect /* 0:M */
948 | fam_nchi_sect { OCCUR2(NCHI, 0, 1) }
949 | fam_subm_sect /* 0:M */
950 | lds_spouse_seal_sub /* 0:M */
951 | source_cit_sub /* 0:M */
952 | multim_link_sub /* 0:M */
953 | note_struc_sub /* 0:M */
954 | ident_struc_sub /* 0:1 */
955 | change_date_sub /* 0:1 */
960 fam_husb_sect : OPEN DELIM TAG_HUSB mand_pointer
961 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
963 if (xr == NULL) HANDLE_ERROR;
964 $<ctxt>$ = start_element(ELT_FAM_HUSB,
966 GEDCOM_MAKE_XREF_PTR(val1, xr));
967 START(HUSB, $1, $<ctxt>$)
972 { end_element(ELT_FAM_HUSB, PARENT, $<ctxt>5,
973 GEDCOM_MAKE_NULL(val1));
978 fam_wife_sect : OPEN DELIM TAG_WIFE mand_pointer
979 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
981 if (xr == NULL) HANDLE_ERROR;
982 $<ctxt>$ = start_element(ELT_FAM_WIFE,
984 GEDCOM_MAKE_XREF_PTR(val1, xr));
985 START(WIFE, $1, $<ctxt>$)
990 { end_element(ELT_FAM_WIFE, PARENT, $<ctxt>5,
991 GEDCOM_MAKE_NULL(val1));
996 fam_chil_sect : OPEN DELIM TAG_CHIL mand_pointer
997 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
999 if (xr == NULL) HANDLE_ERROR;
1000 $<ctxt>$ = start_element(ELT_FAM_CHIL,
1002 GEDCOM_MAKE_XREF_PTR(val1, xr));
1003 START(CHIL, $1, $<ctxt>$)
1008 { end_element(ELT_FAM_CHIL, PARENT, $<ctxt>5,
1009 GEDCOM_MAKE_NULL(val1));
1014 fam_nchi_sect : OPEN DELIM TAG_NCHI mand_line_item
1015 { $<ctxt>$ = start_element(ELT_FAM_NCHI,
1017 GEDCOM_MAKE_STRING(val1, $4));
1018 START(NCHI, $1, $<ctxt>$)
1023 { end_element(ELT_FAM_NCHI, PARENT, $<ctxt>5,
1024 GEDCOM_MAKE_NULL(val1));
1029 fam_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1030 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1032 if (xr == NULL) HANDLE_ERROR;
1033 $<ctxt>$ = start_element(ELT_FAM_SUBM,
1035 GEDCOM_MAKE_XREF_PTR(val1, xr));
1036 START(SUBM, $1, $<ctxt>$)
1041 { end_element(ELT_FAM_SUBM, PARENT, $<ctxt>5,
1042 GEDCOM_MAKE_NULL(val1));
1046 /*********************************************************************/
1047 /**** Individual record ****/
1048 /*********************************************************************/
1049 indiv_rec : OPEN DELIM POINTER DELIM TAG_INDI
1050 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1052 if (xr == NULL) HANDLE_ERROR;
1053 $<ctxt>$ = start_record(REC_INDI,
1054 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1055 NULL, GEDCOM_MAKE_NULL(val2));
1056 START(INDI, $1, $<ctxt>$) }
1060 { end_record(REC_INDI, $<ctxt>6, GEDCOM_MAKE_NULL(val1));
1061 if (compat_mode(C_NO_SLGC_FAMC))
1062 compat_generate_slgc_famc_fam();
1066 indi_subs : /* empty */
1067 | indi_subs indi_sub
1070 indi_sub : indi_resn_sect { OCCUR2(RESN, 0, 1) }
1071 | pers_name_struc_sub /* 0:M */
1072 | indi_sex_sect { OCCUR2(SEX, 0, 1) }
1073 | indiv_even_struc_sub /* 0:M */
1074 | indiv_attr_struc_sub /* 0:M */
1075 | lds_indiv_ord_sub /* 0:M */
1076 | chi_fam_link_sub /* 0:M */
1077 | spou_fam_link_sub /* 0:M */
1078 | indi_subm_sect /* 0:M */
1079 | assoc_struc_sub /* 0:M */
1080 | indi_alia_sect /* 0:M */
1081 | indi_anci_sect /* 0:M */
1082 | indi_desi_sect /* 0:M */
1083 | source_cit_sub /* 0:M */
1084 | multim_link_sub /* 0:M */
1085 | note_struc_sub /* 0:M */
1086 | indi_rfn_sect { OCCUR2(RFN, 0, 1) }
1087 | indi_afn_sect /* 0:M */
1088 | ident_struc_sub /* 0:1 */
1089 | change_date_sub /* 0:1 */
1090 | indi_addr_sect { if (!compat_mode(C_INDI_ADDR))
1091 INVALID_TAG("ADDR");
1097 indi_resn_sect : OPEN DELIM TAG_RESN mand_line_item
1098 { $<ctxt>$ = start_element(ELT_INDI_RESN,
1100 GEDCOM_MAKE_STRING(val1, $4));
1101 START(RESN, $1, $<ctxt>$)
1106 { end_element(ELT_INDI_RESN, PARENT, $<ctxt>5,
1107 GEDCOM_MAKE_NULL(val1));
1112 indi_sex_sect : OPEN DELIM TAG_SEX mand_line_item
1113 { $<ctxt>$ = start_element(ELT_INDI_SEX,
1115 GEDCOM_MAKE_STRING(val1, $4));
1116 START(SEX, $1, $<ctxt>$)
1121 { end_element(ELT_INDI_SEX, PARENT, $<ctxt>5,
1122 GEDCOM_MAKE_NULL(val1));
1127 indi_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1128 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1130 if (xr == NULL) HANDLE_ERROR;
1131 $<ctxt>$ = start_element(ELT_INDI_SUBM,
1133 GEDCOM_MAKE_XREF_PTR(val1, xr));
1134 START(SUBM, $1, $<ctxt>$)
1139 { end_element(ELT_INDI_SUBM, PARENT, $<ctxt>5,
1140 GEDCOM_MAKE_NULL(val1));
1145 indi_alia_sect : OPEN DELIM TAG_ALIA mand_pointer
1146 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1148 if (xr == NULL) HANDLE_ERROR;
1149 $<ctxt>$ = start_element(ELT_INDI_ALIA,
1151 GEDCOM_MAKE_XREF_PTR(val1, xr));
1152 START(ALIA, $1, $<ctxt>$)
1157 { end_element(ELT_INDI_ALIA, PARENT, $<ctxt>5,
1158 GEDCOM_MAKE_NULL(val1));
1163 indi_anci_sect : OPEN DELIM TAG_ANCI mand_pointer
1164 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1166 if (xr == NULL) HANDLE_ERROR;
1167 $<ctxt>$ = start_element(ELT_INDI_ANCI,
1169 GEDCOM_MAKE_XREF_PTR(val1, xr));
1170 START(ANCI, $1, $<ctxt>$)
1175 { end_element(ELT_INDI_ANCI, PARENT, $<ctxt>5,
1176 GEDCOM_MAKE_NULL(val1));
1181 indi_desi_sect : OPEN DELIM TAG_DESI mand_pointer
1182 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1184 if (xr == NULL) HANDLE_ERROR;
1185 $<ctxt>$ = start_element(ELT_INDI_DESI,
1187 GEDCOM_MAKE_XREF_PTR(val1, xr));
1188 START(DESI, $1, $<ctxt>$)
1193 { end_element(ELT_INDI_DESI, PARENT, $<ctxt>5,
1194 GEDCOM_MAKE_NULL(val1));
1199 indi_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1200 { $<ctxt>$ = start_element(ELT_INDI_RFN,
1202 GEDCOM_MAKE_STRING(val1, $4));
1203 START(RFN, $1, $<ctxt>$)
1208 { end_element(ELT_INDI_RFN, PARENT, $<ctxt>5,
1209 GEDCOM_MAKE_NULL(val1));
1214 indi_afn_sect : OPEN DELIM TAG_AFN mand_line_item
1215 { $<ctxt>$ = start_element(ELT_INDI_AFN,
1217 GEDCOM_MAKE_STRING(val1, $4));
1218 START(AFN, $1, $<ctxt>$)
1223 { end_element(ELT_INDI_AFN, PARENT, $<ctxt>5,
1224 GEDCOM_MAKE_NULL(val1));
1228 /* INDI.ADDR (Only for compatibility) */
1229 indi_addr_sect : OPEN DELIM TAG_ADDR opt_line_item
1230 { if (compat_mode(C_INDI_ADDR)) {
1231 Gedcom_ctxt par = compat_generate_resi_start(PARENT);
1232 START(RESI, $1, par);
1234 = start_element(ELT_SUB_ADDR,
1235 par, $1 + 1, $3, $4,
1236 GEDCOM_MAKE_NULL_OR_STRING(val2, $4));
1237 reset_buffer(&concat_buffer);
1238 safe_buf_append(&concat_buffer, $4);
1239 START(ADDR, $1 + 1, $<ctxt>$);
1241 else { START(ADDR, $1, NULL) }
1246 { if (compat_mode(C_INDI_ADDR)) {
1247 Gedcom_ctxt par = PARENT;
1248 char* complete = get_buf_string(&concat_buffer);
1249 end_element(ELT_SUB_ADDR, par, $<ctxt>5,
1250 GEDCOM_MAKE_STRING(val1, complete));
1252 compat_generate_resi_end(PARENT, par);
1257 ftree_addr_subs : /* empty */
1258 | ftree_addr_subs ftree_addr_sub
1261 ftree_addr_sub : continuation_sub
1262 | ftree_addr_phon_sect
1266 ftree_addr_phon_sect : OPEN DELIM TAG_PHON mand_line_item
1268 = start_element(ELT_SUB_PHON,
1269 GRANDPARENT(1), $1, $3, $4,
1270 GEDCOM_MAKE_STRING(val1, $4));
1271 START(PHON, $1, $<ctxt>$)
1276 { end_element(ELT_SUB_PHON, GRANDPARENT(1),
1277 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1281 /*********************************************************************/
1282 /**** Multimedia record ****/
1283 /*********************************************************************/
1284 multim_rec : OPEN DELIM POINTER DELIM TAG_OBJE
1285 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1287 if (xr == NULL) HANDLE_ERROR;
1288 $<ctxt>$ = start_record(REC_OBJE,
1289 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1290 NULL, GEDCOM_MAKE_NULL(val2));
1291 START(OBJE, $1, $<ctxt>$) }
1293 { CHECK2(FORM, BLOB) }
1295 { end_record(REC_OBJE, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1298 obje_subs : /* empty */
1299 | obje_subs obje_sub
1302 obje_sub : obje_form_sect { OCCUR2(FORM, 1, 1) }
1303 | obje_titl_sect { OCCUR2(TITL, 0, 1) }
1304 | note_struc_sub /* 0:M */
1305 | obje_blob_sect { OCCUR2(BLOB, 1, 1) }
1306 | obje_obje_sect { OCCUR2(OBJE, 0, 1) }
1307 | ident_struc_sub /* 0:1 */
1308 | change_date_sub /* 0:1 */
1313 obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
1314 { $<ctxt>$ = start_element(ELT_OBJE_FORM,
1316 GEDCOM_MAKE_STRING(val1, $4));
1317 START(FORM, $1, $<ctxt>$)
1322 { end_element(ELT_OBJE_FORM, PARENT, $<ctxt>5,
1323 GEDCOM_MAKE_NULL(val1));
1328 obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1329 { $<ctxt>$ = start_element(ELT_OBJE_TITL,
1331 GEDCOM_MAKE_STRING(val1, $4));
1332 START(TITL, $1, $<ctxt>$)
1337 { end_element(ELT_OBJE_TITL, PARENT, $<ctxt>5,
1338 GEDCOM_MAKE_NULL(val1));
1343 obje_blob_sect : OPEN DELIM TAG_BLOB
1344 { $<ctxt>$ = start_element(ELT_OBJE_BLOB,
1345 PARENT, $1, $3, NULL,
1346 GEDCOM_MAKE_NULL(val1));
1347 reset_buffer(&concat_buffer);
1348 START(BLOB, $1, $<ctxt>$)
1353 { char* complete = get_buf_string(&concat_buffer);
1354 end_element(ELT_OBJE_BLOB, PARENT, $<ctxt>4,
1355 GEDCOM_MAKE_STRING(val1, complete));
1359 obje_blob_subs : /* empty */
1360 | obje_blob_subs obje_blob_sub
1363 obje_blob_sub : obje_blob_cont_sect { OCCUR1(CONT, 1) }
1367 obje_blob_cont_sect : OPEN DELIM TAG_CONT mand_line_item
1368 { $<ctxt>$ = start_element(ELT_OBJE_BLOB_CONT,
1370 GEDCOM_MAKE_STRING(val1, $4));
1371 safe_buf_append(&concat_buffer, $4);
1372 START(CONT, $1, $<ctxt>$)
1377 { end_element(ELT_OBJE_BLOB_CONT, PARENT,
1378 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1383 obje_obje_sect : OPEN DELIM TAG_OBJE mand_pointer
1384 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1386 if (xr == NULL) HANDLE_ERROR;
1387 $<ctxt>$ = start_element(ELT_OBJE_OBJE,
1389 GEDCOM_MAKE_XREF_PTR(val1, xr));
1390 START(OBJE, $1, $<ctxt>$)
1395 { end_element(ELT_OBJE_OBJE, PARENT, $<ctxt>5,
1396 GEDCOM_MAKE_NULL(val1));
1400 /*********************************************************************/
1401 /**** Note record ****/
1402 /*********************************************************************/
1403 note_rec : OPEN DELIM POINTER DELIM TAG_NOTE note_line_item
1404 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1406 if (xr == NULL) HANDLE_ERROR;
1407 $<ctxt>$ = start_record(REC_NOTE,
1408 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1409 $6, GEDCOM_MAKE_STRING(val2, $6));
1410 reset_buffer(&concat_buffer);
1411 safe_buf_append(&concat_buffer, $6);
1412 START(NOTE, $1, $<ctxt>$) }
1416 { char* complete = get_buf_string(&concat_buffer);
1417 end_record(REC_NOTE, $<ctxt>7,
1418 GEDCOM_MAKE_STRING(val1, complete)); }
1421 note_line_item : /* empty */
1422 { if (!compat_mode(C_NOTE_NO_VALUE)) {
1423 gedcom_error(_("Missing value")); YYERROR;
1430 { gedcom_debug_print("==Val: %s==", $2);
1434 note_subs : /* empty */
1435 | note_subs note_sub
1438 note_sub : continuation_sub /* 0:M */
1439 | source_cit_sub /* 0:M */
1440 | ident_struc_sub /* 0:1 */
1441 | change_date_sub /* 0:1 */
1445 /*********************************************************************/
1446 /**** Repository record ****/
1447 /*********************************************************************/
1448 repos_rec : OPEN DELIM POINTER DELIM TAG_REPO
1449 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1451 if (xr == NULL) HANDLE_ERROR;
1452 $<ctxt>$ = start_record(REC_REPO,
1453 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1454 NULL, GEDCOM_MAKE_NULL(val2));
1455 START(REPO, $1, $<ctxt>$) }
1459 { end_record(REC_REPO, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1462 repo_subs : /* empty */
1463 | repo_subs repo_sub
1466 repo_sub : repo_name_sect { OCCUR2(NAME, 0, 1) }
1467 | addr_struc_sub /* 0:1 */
1468 | note_struc_sub /* 0:M */
1469 | ident_struc_sub /* 0:1 */
1470 | change_date_sub /* 0:1 */
1475 repo_name_sect : OPEN DELIM TAG_NAME mand_line_item
1476 { $<ctxt>$ = start_element(ELT_REPO_NAME,
1478 GEDCOM_MAKE_STRING(val1, $4));
1479 START(NAME, $1, $<ctxt>$)
1484 { end_element(ELT_REPO_NAME, PARENT, $<ctxt>5,
1485 GEDCOM_MAKE_NULL(val1));
1489 /*********************************************************************/
1490 /**** Source record ****/
1491 /*********************************************************************/
1492 source_rec : OPEN DELIM POINTER DELIM TAG_SOUR
1493 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1495 if (xr == NULL) HANDLE_ERROR;
1496 $<ctxt>$ = start_record(REC_SOUR,
1497 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1498 NULL, GEDCOM_MAKE_NULL(val2));
1499 START(SOUR, $1, $<ctxt>$) }
1503 { end_record(REC_SOUR, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1506 sour_subs : /* empty */
1507 | sour_subs sour_sub
1510 sour_sub : sour_data_sect { OCCUR2(DATA, 0, 1) }
1511 | sour_auth_sect { OCCUR2(AUTH, 0, 1) }
1512 | sour_titl_sect { OCCUR2(TITL, 0, 1) }
1513 | sour_abbr_sect { OCCUR2(ABBR, 0, 1) }
1514 | sour_publ_sect { OCCUR2(PUBL, 0, 1) }
1515 | sour_text_sect { OCCUR2(TEXT, 0, 1) }
1516 | source_repos_cit_sub /* 0:1 */
1517 | multim_link_sub /* 0:M */
1518 | note_struc_sub /* 0:M */
1519 | ident_struc_sub /* 0:1 */
1520 | change_date_sub /* 0:1 */
1525 sour_data_sect : OPEN DELIM TAG_DATA
1526 { $<ctxt>$ = start_element(ELT_SOUR_DATA,
1527 PARENT, $1, $3, NULL,
1528 GEDCOM_MAKE_NULL(val1));
1529 START(DATA, $1, $<ctxt>$)
1534 { end_element(ELT_SOUR_DATA, PARENT, $<ctxt>4,
1535 GEDCOM_MAKE_NULL(val1));
1539 sour_data_subs : /* empty */
1540 | sour_data_subs sour_data_sub
1543 sour_data_sub : sour_data_even_sect /* 0:M */
1544 | sour_data_agnc_sect { OCCUR2(AGNC, 0, 1) }
1545 | note_struc_sub /* 0:M */
1549 sour_data_even_sect : OPEN DELIM TAG_EVEN mand_line_item
1550 { $<ctxt>$ = start_element(ELT_SOUR_DATA_EVEN,
1552 GEDCOM_MAKE_STRING(val1, $4));
1553 START(EVEN, $1, $<ctxt>$)
1558 { end_element(ELT_SOUR_DATA_EVEN, PARENT,
1559 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1563 sour_data_even_subs : /* empty */
1564 | sour_data_even_subs sour_data_even_sub
1567 sour_data_even_sub : sour_data_even_date_sect { OCCUR2(DATE, 0, 1) }
1568 | sour_data_even_plac_sect { OCCUR2(PLAC, 0, 1) }
1572 sour_data_even_date_sect : OPEN DELIM TAG_DATE mand_line_item
1573 { struct date_value dv = gedcom_parse_date($4);
1575 = start_element(ELT_SOUR_DATA_EVEN_DATE,
1577 GEDCOM_MAKE_DATE(val1, dv));
1578 START(DATE, $1, $<ctxt>$)
1583 { end_element(ELT_SOUR_DATA_EVEN_DATE, PARENT,
1584 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1588 sour_data_even_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
1590 = start_element(ELT_SOUR_DATA_EVEN_PLAC,
1592 GEDCOM_MAKE_STRING(val1, $4));
1593 START(PLAC, $1, $<ctxt>$)
1598 { end_element(ELT_SOUR_DATA_EVEN_PLAC, PARENT,
1599 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1603 sour_data_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
1604 { $<ctxt>$ = start_element(ELT_SOUR_DATA_AGNC,
1606 GEDCOM_MAKE_STRING(val1, $4));
1607 START(AGNC, $1, $<ctxt>$)
1612 { end_element(ELT_SOUR_DATA_AGNC, PARENT,
1613 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1618 sour_auth_sect : OPEN DELIM TAG_AUTH mand_line_item
1619 { $<ctxt>$ = start_element(ELT_SOUR_AUTH,
1621 GEDCOM_MAKE_STRING(val1, $4));
1622 reset_buffer(&concat_buffer);
1623 safe_buf_append(&concat_buffer, $4);
1624 START(AUTH, $1, $<ctxt>$)
1629 { char* complete = get_buf_string(&concat_buffer);
1630 end_element(ELT_SOUR_AUTH, PARENT, $<ctxt>5,
1631 GEDCOM_MAKE_STRING(val1, complete));
1635 sour_auth_subs : /* empty */
1636 | sour_auth_subs sour_auth_sub
1639 sour_auth_sub : continuation_sub /* 0:M */
1644 sour_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1645 { $<ctxt>$ = start_element(ELT_SOUR_TITL,
1647 GEDCOM_MAKE_STRING(val1, $4));
1648 reset_buffer(&concat_buffer);
1649 safe_buf_append(&concat_buffer, $4);
1650 START(TITL, $1, $<ctxt>$)
1655 { char* complete = get_buf_string(&concat_buffer);
1656 end_element(ELT_SOUR_TITL, PARENT, $<ctxt>5,
1657 GEDCOM_MAKE_STRING(val1, complete));
1661 sour_titl_subs : /* empty */
1662 | sour_titl_subs sour_titl_sub
1665 sour_titl_sub : continuation_sub /* 0:M */
1670 sour_abbr_sect : OPEN DELIM TAG_ABBR mand_line_item
1671 { $<ctxt>$ = start_element(ELT_SOUR_ABBR,
1673 GEDCOM_MAKE_STRING(val1, $4));
1674 START(ABBR, $1, $<ctxt>$)
1679 { end_element(ELT_SOUR_ABBR, PARENT, $<ctxt>5,
1680 GEDCOM_MAKE_NULL(val1));
1685 sour_publ_sect : OPEN DELIM TAG_PUBL mand_line_item
1686 { $<ctxt>$ = start_element(ELT_SOUR_PUBL,
1688 GEDCOM_MAKE_STRING(val1, $4));
1689 reset_buffer(&concat_buffer);
1690 safe_buf_append(&concat_buffer, $4);
1691 START(PUBL, $1, $<ctxt>$)
1696 { char* complete = get_buf_string(&concat_buffer);
1697 end_element(ELT_SOUR_PUBL, PARENT, $<ctxt>5,
1698 GEDCOM_MAKE_STRING(val1, complete));
1702 sour_publ_subs : /* empty */
1703 | sour_publ_subs sour_publ_sub
1706 sour_publ_sub : continuation_sub /* 0:M */
1711 sour_text_sect : OPEN DELIM TAG_TEXT mand_line_item
1712 { $<ctxt>$ = start_element(ELT_SOUR_TEXT,
1714 GEDCOM_MAKE_STRING(val1, $4));
1715 reset_buffer(&concat_buffer);
1716 safe_buf_append(&concat_buffer, $4);
1717 START(TEXT, $1, $<ctxt>$)
1722 { char* complete = get_buf_string(&concat_buffer);
1723 end_element(ELT_SOUR_TEXT, PARENT, $<ctxt>5,
1724 GEDCOM_MAKE_STRING(val1, complete));
1728 sour_text_subs : /* empty */
1729 | sour_text_subs sour_text_sub
1732 sour_text_sub : continuation_sub /* 0:M */
1736 /*********************************************************************/
1737 /**** Submission record ****/
1738 /*********************************************************************/
1739 submis_rec : OPEN DELIM POINTER DELIM TAG_SUBN
1740 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1742 if (xr == NULL) HANDLE_ERROR;
1743 $<ctxt>$ = start_record(REC_SUBN,
1744 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1745 NULL, GEDCOM_MAKE_NULL(val2));
1746 START(SUBN, $1, $<ctxt>$) }
1750 { end_record(REC_SUBN, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1753 subn_subs : /* empty */
1754 | subn_subs subn_sub
1757 subn_sub : subn_subm_sect { OCCUR2(SUBM, 0, 1) }
1758 | subn_famf_sect { OCCUR2(FAMF, 0, 1) }
1759 | subn_temp_sect { OCCUR2(TEMP, 0, 1) }
1760 | subn_ance_sect { OCCUR2(ANCE, 0, 1) }
1761 | subn_desc_sect { OCCUR2(DESC, 0, 1) }
1762 | subn_ordi_sect { OCCUR2(ORDI, 0, 1) }
1763 | subn_rin_sect { OCCUR2(RIN, 0, 1) }
1768 subn_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1769 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1771 if (xr == NULL) HANDLE_ERROR;
1772 $<ctxt>$ = start_element(ELT_SUBN_SUBM,
1774 GEDCOM_MAKE_XREF_PTR(val1, xr));
1775 START(SUBM, $1, $<ctxt>$)
1780 { end_element(ELT_SUBN_SUBM, PARENT, $<ctxt>5,
1781 GEDCOM_MAKE_NULL(val1));
1786 subn_famf_sect : OPEN DELIM TAG_FAMF mand_line_item
1787 { $<ctxt>$ = start_element(ELT_SUBN_FAMF,
1789 GEDCOM_MAKE_STRING(val1, $4));
1790 START(FAMF, $1, $<ctxt>$)
1795 { end_element(ELT_SUBN_FAMF, PARENT, $<ctxt>5,
1796 GEDCOM_MAKE_NULL(val1));
1801 subn_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
1802 { $<ctxt>$ = start_element(ELT_SUBN_TEMP,
1804 GEDCOM_MAKE_STRING(val1, $4));
1805 START(TEMP, $1, $<ctxt>$)
1810 { end_element(ELT_SUBN_TEMP, PARENT, $<ctxt>5,
1811 GEDCOM_MAKE_NULL(val1));
1816 subn_ance_sect : OPEN DELIM TAG_ANCE mand_line_item
1817 { $<ctxt>$ = start_element(ELT_SUBN_ANCE,
1819 GEDCOM_MAKE_STRING(val1, $4));
1820 START(ANCE, $1, $<ctxt>$)
1825 { end_element(ELT_SUBN_ANCE, PARENT, $<ctxt>5,
1826 GEDCOM_MAKE_NULL(val1));
1831 subn_desc_sect : OPEN DELIM TAG_DESC mand_line_item
1832 { $<ctxt>$ = start_element(ELT_SUBN_DESC,
1834 GEDCOM_MAKE_STRING(val1, $4));
1835 START(DESC, $1, $<ctxt>$)
1840 { end_element(ELT_SUBN_DESC, PARENT, $<ctxt>5,
1841 GEDCOM_MAKE_NULL(val1));
1846 subn_ordi_sect : OPEN DELIM TAG_ORDI mand_line_item
1847 { $<ctxt>$ = start_element(ELT_SUBN_ORDI,
1849 GEDCOM_MAKE_STRING(val1, $4));
1850 START(ORDI, $1, $<ctxt>$)
1855 { end_element(ELT_SUBN_ORDI, PARENT, $<ctxt>5,
1856 GEDCOM_MAKE_NULL(val1));
1861 subn_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1862 { $<ctxt>$ = start_element(ELT_SUBN_RIN,
1864 GEDCOM_MAKE_STRING(val1, $4));
1865 START(RIN, $1, $<ctxt>$)
1870 { end_element(ELT_SUBN_RIN, PARENT, $<ctxt>5,
1871 GEDCOM_MAKE_NULL(val1));
1875 /*********************************************************************/
1876 /**** Submitter record ****/
1877 /*********************************************************************/
1878 submit_rec : OPEN DELIM POINTER DELIM TAG_SUBM
1879 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1881 if (xr == NULL) HANDLE_ERROR;
1882 $<ctxt>$ = start_record(REC_SUBM,
1883 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1884 NULL, GEDCOM_MAKE_NULL(val2));
1885 START(SUBM, $1, $<ctxt>$) }
1889 { end_record(REC_SUBM, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1892 subm_subs : /* empty */
1893 | subm_subs subm_sub
1896 subm_sub : subm_name_sect { OCCUR2(NAME, 1, 1) }
1897 | addr_struc_sub /* 0:1 */
1898 | multim_link_sub /* 0:M */
1899 | subm_lang_sect { OCCUR2(LANG, 0, 3) }
1900 | subm_rfn_sect { OCCUR2(RFN, 0, 1) }
1901 | subm_rin_sect { OCCUR2(RIN, 0, 1) }
1902 | change_date_sub /* 0:1 */
1907 subm_name_sect : OPEN DELIM TAG_NAME mand_line_item
1908 { $<ctxt>$ = start_element(ELT_SUBM_NAME,
1910 GEDCOM_MAKE_STRING(val1, $4));
1911 START(NAME, $1, $<ctxt>$)
1916 { end_element(ELT_SUBM_NAME, PARENT, $<ctxt>5,
1917 GEDCOM_MAKE_NULL(val1));
1922 subm_lang_sect : OPEN DELIM TAG_LANG mand_line_item
1923 { $<ctxt>$ = start_element(ELT_SUBM_LANG,
1925 GEDCOM_MAKE_STRING(val1, $4));
1926 START(LANG, $1, $<ctxt>$)
1931 { end_element(ELT_SUBM_LANG, PARENT, $<ctxt>5,
1932 GEDCOM_MAKE_NULL(val1));
1937 subm_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1938 { $<ctxt>$ = start_element(ELT_SUBM_RFN,
1940 GEDCOM_MAKE_STRING(val1, $4));
1941 START(RFN, $1, $<ctxt>$)
1946 { end_element(ELT_SUBM_RFN, PARENT, $<ctxt>5,
1947 GEDCOM_MAKE_NULL(val1));
1952 subm_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1953 { $<ctxt>$ = start_element(ELT_SUBM_RIN,
1955 GEDCOM_MAKE_STRING(val1, $4));
1956 START(RIN, $1, $<ctxt>$)
1961 { end_element(ELT_SUBM_RIN, PARENT, $<ctxt>5,
1962 GEDCOM_MAKE_NULL(val1));
1966 /*********************************************************************/
1967 /**** Substructures ****/
1968 /*********************************************************************/
1970 /* ADDRESS STRUCTURE */
1971 addr_struc_sub : addr_sect { OCCUR2(ADDR, 0, 1) }
1972 | phon_sect { OCCUR2(PHON, 0, 3) }
1975 addr_sect : OPEN DELIM TAG_ADDR mand_line_item
1976 { $<ctxt>$ = start_element(ELT_SUB_ADDR,
1978 GEDCOM_MAKE_STRING(val1, $4));
1979 reset_buffer(&concat_buffer);
1980 safe_buf_append(&concat_buffer, $4);
1981 START(ADDR, $1, $<ctxt>$)
1986 { char* complete = get_buf_string(&concat_buffer);
1987 end_element(ELT_SUB_ADDR, PARENT, $<ctxt>5,
1988 GEDCOM_MAKE_STRING(val1, complete));
1992 addr_subs : /* empty */
1993 | addr_subs addr_sub
1996 addr_sub : addr_cont_sect /* 0:M */
1997 | addr_adr1_sect { OCCUR2(ADR1, 0, 1) }
1998 | addr_adr2_sect { OCCUR2(ADR2, 0, 1) }
1999 | addr_city_sect { OCCUR2(CITY, 0, 1) }
2000 | addr_stae_sect { OCCUR2(STAE, 0, 1) }
2001 | addr_post_sect { OCCUR2(POST, 0, 1) }
2002 | addr_ctry_sect { OCCUR2(CTRY, 0, 1) }
2006 addr_cont_sect : OPEN DELIM TAG_CONT mand_line_item
2007 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CONT,
2009 GEDCOM_MAKE_STRING(val1, $4));
2010 SAFE_BUF_ADDCHAR(&concat_buffer, '\n');
2011 safe_buf_append(&concat_buffer, $4);
2012 START(CONT, $1, $<ctxt>$)
2017 { end_element(ELT_SUB_ADDR_CONT, PARENT, $<ctxt>5,
2018 GEDCOM_MAKE_NULL(val1));
2021 addr_adr1_sect : OPEN DELIM TAG_ADR1 mand_line_item
2022 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR1,
2024 GEDCOM_MAKE_STRING(val1, $4));
2025 START(ADR1, $1, $<ctxt>$)
2030 { end_element(ELT_SUB_ADDR_ADR1, PARENT, $<ctxt>5,
2031 GEDCOM_MAKE_NULL(val1));
2034 addr_adr2_sect : OPEN DELIM TAG_ADR2 mand_line_item
2035 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR2,
2037 GEDCOM_MAKE_STRING(val1, $4));
2038 START(ADR2, $1, $<ctxt>$)
2043 { end_element(ELT_SUB_ADDR_ADR2, PARENT, $<ctxt>5,
2044 GEDCOM_MAKE_NULL(val1));
2047 addr_city_sect : OPEN DELIM TAG_CITY mand_line_item
2048 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CITY,
2050 GEDCOM_MAKE_STRING(val1, $4));
2051 START(CITY, $1, $<ctxt>$)
2056 { end_element(ELT_SUB_ADDR_CITY, PARENT, $<ctxt>5,
2057 GEDCOM_MAKE_NULL(val1));
2060 addr_stae_sect : OPEN DELIM TAG_STAE mand_line_item
2061 { $<ctxt>$ = start_element(ELT_SUB_ADDR_STAE,
2063 GEDCOM_MAKE_STRING(val1, $4));
2064 START(STAE, $1, $<ctxt>$)
2069 { end_element(ELT_SUB_ADDR_STAE, PARENT, $<ctxt>5,
2070 GEDCOM_MAKE_NULL(val1));
2073 addr_post_sect : OPEN DELIM TAG_POST mand_line_item
2074 { $<ctxt>$ = start_element(ELT_SUB_ADDR_POST,
2076 GEDCOM_MAKE_STRING(val1, $4));
2077 START(POST, $1, $<ctxt>$)
2082 { end_element(ELT_SUB_ADDR_POST, PARENT, $<ctxt>5,
2083 GEDCOM_MAKE_NULL(val1));
2086 addr_ctry_sect : OPEN DELIM TAG_CTRY mand_line_item
2087 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CTRY,
2089 GEDCOM_MAKE_STRING(val1, $4));
2090 START(CTRY, $1, $<ctxt>$)
2095 { end_element(ELT_SUB_ADDR_CTRY, PARENT, $<ctxt>5,
2096 GEDCOM_MAKE_NULL(val1));
2100 phon_sect : OPEN DELIM TAG_PHON mand_line_item
2101 { $<ctxt>$ = start_element(ELT_SUB_PHON,
2103 GEDCOM_MAKE_STRING(val1, $4));
2104 START(PHON, $1, $<ctxt>$)
2109 { end_element(ELT_SUB_PHON, PARENT, $<ctxt>5,
2110 GEDCOM_MAKE_NULL(val1));
2114 /* ASSOCIATION STRUCTURE */
2115 assoc_struc_sub : asso_sect /* 0:M */
2118 asso_sect : OPEN DELIM TAG_ASSO mand_pointer
2119 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2121 if (xr == NULL) HANDLE_ERROR;
2122 $<ctxt>$ = start_element(ELT_SUB_ASSO,
2124 GEDCOM_MAKE_XREF_PTR(val1, xr));
2125 START(ASSO, $1, $<ctxt>$)
2128 { CHECK2(TYPE,RELA) }
2130 { end_element(ELT_SUB_ASSO, PARENT, $<ctxt>5,
2131 GEDCOM_MAKE_NULL(val1));
2135 asso_subs : /* empty */
2136 | asso_type_sect { OCCUR2(TYPE, 1, 1) }
2137 | asso_rela_sect { OCCUR2(RELA, 1, 1) }
2143 asso_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2144 { $<ctxt>$ = start_element(ELT_SUB_ASSO_TYPE,
2146 GEDCOM_MAKE_STRING(val1, $4));
2147 START(TYPE, $1, $<ctxt>$)
2152 { end_element(ELT_SUB_ASSO_TYPE, PARENT, $<ctxt>5,
2153 GEDCOM_MAKE_NULL(val1));
2157 asso_rela_sect : OPEN DELIM TAG_RELA mand_line_item
2158 { $<ctxt>$ = start_element(ELT_SUB_ASSO_RELA,
2160 GEDCOM_MAKE_STRING(val1, $4));
2161 START(RELA, $1, $<ctxt>$)
2166 { end_element(ELT_SUB_ASSO_RELA, PARENT, $<ctxt>5,
2167 GEDCOM_MAKE_NULL(val1));
2172 change_date_sub : change_date_chan_sect { OCCUR2(CHAN, 0, 1) }
2175 change_date_chan_sect : OPEN DELIM TAG_CHAN
2176 { $<ctxt>$ = start_element(ELT_SUB_CHAN,
2177 PARENT, $1, $3, NULL,
2178 GEDCOM_MAKE_NULL(val1));
2179 START(CHAN, $1, $<ctxt>$)
2181 change_date_chan_subs
2184 { end_element(ELT_SUB_CHAN, PARENT, $<ctxt>4,
2185 GEDCOM_MAKE_NULL(val1));
2189 change_date_chan_subs : /* empty */
2190 | change_date_chan_subs change_date_chan_sub
2193 change_date_chan_sub : change_date_date_sect { OCCUR2(DATE, 1, 1) }
2198 change_date_date_sect : OPEN DELIM TAG_DATE mand_line_item
2199 { struct date_value dv = gedcom_parse_date($4);
2200 $<ctxt>$ = start_element(ELT_SUB_CHAN_DATE,
2202 GEDCOM_MAKE_DATE(val1, dv));
2203 START(DATE, $1, $<ctxt>$) }
2204 change_date_date_subs
2207 { end_element(ELT_SUB_CHAN_DATE, PARENT, $<ctxt>5,
2208 GEDCOM_MAKE_NULL(val1));
2212 change_date_date_subs : /* empty */
2213 | change_date_date_subs change_date_date_sub
2216 change_date_date_sub : change_date_date_time_sect { OCCUR2(TIME, 0, 1) }
2220 change_date_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
2222 = start_element(ELT_SUB_CHAN_TIME,
2224 GEDCOM_MAKE_STRING(val1, $4));
2225 START(TIME, $1, $<ctxt>$)
2230 { end_element(ELT_SUB_CHAN_TIME, PARENT, $<ctxt>5,
2231 GEDCOM_MAKE_NULL(val1));
2235 /* CHILD TO FAMILY LINK */
2236 chi_fam_link_sub : famc_sect /* 0:M */
2239 famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2240 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2242 if (xr == NULL) HANDLE_ERROR;
2243 $<ctxt>$ = start_element(ELT_SUB_FAMC,
2245 GEDCOM_MAKE_XREF_PTR(val1, xr));
2246 START(FAMC, $1, $<ctxt>$)
2251 { end_element(ELT_SUB_FAMC, PARENT, $<ctxt>5,
2252 GEDCOM_MAKE_NULL(val1));
2256 famc_subs : /* empty */
2257 | famc_subs famc_sub
2260 famc_sub : famc_pedi_sect /* 0:M */
2265 famc_pedi_sect : OPEN DELIM TAG_PEDI mand_line_item
2266 { $<ctxt>$ = start_element(ELT_SUB_FAMC_PEDI,
2268 GEDCOM_MAKE_STRING(val1, $4));
2269 START(PEDI, $1, $<ctxt>$)
2274 { end_element(ELT_SUB_FAMC_PEDI, PARENT, $<ctxt>5,
2275 GEDCOM_MAKE_NULL(val1));
2279 /* CONTINUATION SUBSECTIONS */
2280 continuation_sub : cont_sect /* 0:M */
2281 | conc_sect /* 0:M */
2284 cont_sect : OPEN DELIM TAG_CONT mand_line_item
2285 { $<ctxt>$ = start_element(ELT_SUB_CONT,
2287 GEDCOM_MAKE_STRING(val1, $4));
2288 if (compat_mode(C_NOTE_NO_VALUE)) {
2289 char* str = get_buf_string(&concat_buffer);
2291 SAFE_BUF_ADDCHAR(&concat_buffer, '\n');
2294 SAFE_BUF_ADDCHAR(&concat_buffer, '\n');
2296 safe_buf_append(&concat_buffer, $4);
2297 START(CONT, $1, $<ctxt>$)
2302 { end_element(ELT_SUB_CONT, PARENT, $<ctxt>5,
2303 GEDCOM_MAKE_NULL(val1));
2307 conc_sect : OPEN DELIM TAG_CONC mand_line_item
2308 { $<ctxt>$ = start_element(ELT_SUB_CONC,
2310 GEDCOM_MAKE_STRING(val1, $4));
2311 safe_buf_append(&concat_buffer, $4);
2312 START(CONC, $1, $<ctxt>$)
2317 { end_element(ELT_SUB_CONC, PARENT, $<ctxt>5,
2318 GEDCOM_MAKE_NULL(val1));
2323 event_detail_sub : event_detail_type_sect { OCCUR2(TYPE, 0, 1) }
2324 | event_detail_date_sect { OCCUR2(DATE, 0, 1) }
2327 | event_detail_age_sect { OCCUR2(AGE, 0, 1) }
2328 | event_detail_agnc_sect { OCCUR2(AGNC, 0, 1) }
2329 | event_detail_caus_sect { OCCUR2(CAUS, 0, 1) }
2335 event_detail_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2337 = start_element(ELT_SUB_EVT_TYPE,
2339 GEDCOM_MAKE_STRING(val1, $4));
2340 START(TYPE, $1, $<ctxt>$)
2345 { end_element(ELT_SUB_EVT_TYPE, PARENT, $<ctxt>5,
2346 GEDCOM_MAKE_NULL(val1));
2349 event_detail_date_sect : OPEN DELIM TAG_DATE mand_line_item
2350 { struct date_value dv = gedcom_parse_date($4);
2352 = start_element(ELT_SUB_EVT_DATE,
2354 GEDCOM_MAKE_DATE(val1, dv));
2355 START(DATE, $1, $<ctxt>$)
2360 { end_element(ELT_SUB_EVT_DATE, PARENT, $<ctxt>5,
2361 GEDCOM_MAKE_NULL(val1));
2364 event_detail_age_sect : OPEN DELIM TAG_AGE mand_line_item
2365 { struct age_value age = gedcom_parse_age($4);
2367 = start_element(ELT_SUB_EVT_AGE,
2369 GEDCOM_MAKE_AGE(val1, age));
2370 START(AGE, $1, $<ctxt>$)
2375 { end_element(ELT_SUB_EVT_AGE, PARENT, $<ctxt>5,
2376 GEDCOM_MAKE_NULL(val1));
2379 event_detail_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
2381 = start_element(ELT_SUB_EVT_AGNC,
2383 GEDCOM_MAKE_STRING(val1, $4));
2384 START(AGNC, $1, $<ctxt>$)
2389 { end_element(ELT_SUB_EVT_AGNC, PARENT, $<ctxt>5,
2390 GEDCOM_MAKE_NULL(val1));
2393 event_detail_caus_sect : OPEN DELIM TAG_CAUS mand_line_item
2395 = start_element(ELT_SUB_EVT_CAUS,
2397 GEDCOM_MAKE_STRING(val1, $4));
2398 START(CAUS, $1, $<ctxt>$)
2403 { end_element(ELT_SUB_EVT_CAUS, PARENT, $<ctxt>5,
2404 GEDCOM_MAKE_NULL(val1));
2408 /* FAMILY EVENT STRUCTURE */
2409 fam_event_struc_sub : fam_event_sect
2410 | fam_gen_even_sect /* 0:M */
2413 fam_event_sect : OPEN DELIM fam_event_tag opt_value
2415 = start_element(ELT_SUB_FAM_EVT,
2417 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2418 START2($1, $<ctxt>$);
2423 { end_element(ELT_SUB_FAM_EVT, PARENT, $<ctxt>5,
2424 GEDCOM_MAKE_NULL(val1));
2428 fam_event_tag : TAG_ANUL { $$ = $1; START1(ANUL) }
2429 | TAG_CENS { $$ = $1; START1(CENS) }
2430 | TAG_DIV { $$ = $1; START1(DIV) }
2431 | TAG_DIVF { $$ = $1; START1(DIVF) }
2432 | TAG_ENGA { $$ = $1; START1(ENGA) }
2433 | TAG_MARR { $$ = $1; START1(MARR) }
2434 | TAG_MARB { $$ = $1; START1(MARB) }
2435 | TAG_MARC { $$ = $1; START1(MARC) }
2436 | TAG_MARL { $$ = $1; START1(MARL) }
2437 | TAG_MARS { $$ = $1; START1(MARS) }
2440 fam_event_subs : /* empty */
2441 | fam_event_subs fam_event_sub
2444 fam_event_sub : event_detail_sub
2445 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2446 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2450 fam_even_husb_sect : OPEN DELIM TAG_HUSB
2451 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_HUSB,
2452 PARENT, $1, $3, NULL,
2453 GEDCOM_MAKE_NULL(val1));
2454 START(HUSB, $1, $<ctxt>$)
2459 { end_element(ELT_SUB_FAM_EVT_HUSB, PARENT, $<ctxt>4,
2460 GEDCOM_MAKE_NULL(val1));
2464 fam_even_husb_subs : /* empty */
2465 | fam_even_husb_subs fam_even_husb_sub
2468 fam_even_husb_sub : fam_even_age_sect { OCCUR2(AGE, 1, 1) }
2472 fam_even_age_sect : OPEN DELIM TAG_AGE mand_line_item
2473 { struct age_value age = gedcom_parse_age($4);
2474 $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_AGE,
2476 GEDCOM_MAKE_AGE(val1, age));
2477 START(AGE, $1, $<ctxt>$)
2482 { end_element(ELT_SUB_FAM_EVT_AGE, PARENT, $<ctxt>5,
2483 GEDCOM_MAKE_NULL(val1));
2487 fam_even_wife_sect : OPEN DELIM TAG_WIFE
2488 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_WIFE,
2489 PARENT, $1, $3, NULL,
2490 GEDCOM_MAKE_NULL(val1));
2491 START(WIFE, $1, $<ctxt>$)
2496 { end_element(ELT_SUB_FAM_EVT_WIFE, PARENT, $<ctxt>4,
2497 GEDCOM_MAKE_NULL(val1));
2501 fam_gen_even_sect : OPEN DELIM TAG_EVEN
2502 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_EVEN,
2503 PARENT, $1, $3, NULL,
2504 GEDCOM_MAKE_NULL(val1));
2505 START(EVEN, $1, $<ctxt>$)
2510 { end_element(ELT_SUB_FAM_EVT_EVEN, PARENT, $<ctxt>4,
2511 GEDCOM_MAKE_NULL(val1));
2515 fam_gen_even_subs : /* empty */
2516 | fam_gen_even_subs fam_gen_even_sub
2519 fam_gen_even_sub : event_detail_sub
2520 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2521 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2525 /* IDENTIFICATION STRUCTURE */
2526 ident_struc_sub : ident_refn_sect /* 0:M */
2527 | ident_rin_sect { OCCUR2(RIN, 0, 1) }
2530 ident_refn_sect : OPEN DELIM TAG_REFN mand_line_item
2531 { $<ctxt>$ = start_element(ELT_SUB_IDENT_REFN,
2533 GEDCOM_MAKE_STRING(val1, $4));
2534 START(REFN, $1, $<ctxt>$)
2539 { end_element(ELT_SUB_IDENT_REFN, PARENT, $<ctxt>5,
2540 GEDCOM_MAKE_NULL(val1));
2544 ident_refn_subs : /* empty */
2545 | ident_refn_subs ident_refn_sub
2548 ident_refn_sub : ident_refn_type_sect { OCCUR2(TYPE, 0, 1) }
2552 ident_refn_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2554 = start_element(ELT_SUB_IDENT_REFN_TYPE,
2556 GEDCOM_MAKE_STRING(val1, $4));
2557 START(TYPE, $1, $<ctxt>$)
2562 { end_element(ELT_SUB_IDENT_REFN_TYPE, PARENT, $<ctxt>5,
2563 GEDCOM_MAKE_NULL(val1));
2567 ident_rin_sect : OPEN DELIM TAG_RIN mand_line_item
2568 { $<ctxt>$ = start_element(ELT_SUB_IDENT_RIN,
2570 GEDCOM_MAKE_STRING(val1, $4));
2571 START(RIN, $1, $<ctxt>$)
2576 { end_element(ELT_SUB_IDENT_RIN, PARENT, $<ctxt>5,
2577 GEDCOM_MAKE_NULL(val1));
2581 /* INDIVIDUAL ATTRIBUTE STRUCTURE */
2582 indiv_attr_struc_sub : indiv_attr_sect /* 0:M */
2583 | indiv_resi_sect /* 0:M */
2586 indiv_attr_sect : OPEN DELIM indiv_attr_tag mand_line_item
2587 { $<ctxt>$ = start_element(ELT_SUB_INDIV_ATTR,
2589 GEDCOM_MAKE_STRING(val1, $4));
2590 START2($1, $<ctxt>$);
2592 indiv_attr_event_subs
2595 { end_element(ELT_SUB_INDIV_ATTR, PARENT, $<ctxt>5,
2596 GEDCOM_MAKE_NULL(val1));
2600 indiv_attr_tag : TAG_CAST { $$ = $1; START1(CAST) }
2601 | TAG_DSCR { $$ = $1; START1(DSCR) }
2602 | TAG_EDUC { $$ = $1; START1(EDUC) }
2603 | TAG_IDNO { $$ = $1; START1(IDNO) }
2604 | TAG_NATI { $$ = $1; START1(NATI) }
2605 | TAG_NCHI { $$ = $1; START1(NCHI) }
2606 | TAG_NMR { $$ = $1; START1(NMR) }
2607 | TAG_OCCU { $$ = $1; START1(OCCU) }
2608 | TAG_PROP { $$ = $1; START1(PROP) }
2609 | TAG_RELI { $$ = $1; START1(RELI) }
2610 | TAG_SSN { $$ = $1; START1(SSN) }
2611 | TAG_TITL { $$ = $1; START1(TITL) }
2614 indiv_resi_sect : OPEN DELIM TAG_RESI
2615 { $<ctxt>$ = start_element(ELT_SUB_INDIV_RESI,
2616 PARENT, $1, $3, NULL,
2617 GEDCOM_MAKE_NULL(val1));
2618 START(RESI, $1, $<ctxt>$)
2620 indiv_attr_event_subs
2623 { end_element(ELT_SUB_INDIV_RESI, PARENT, $<ctxt>4,
2624 GEDCOM_MAKE_NULL(val1));
2628 indiv_attr_event_subs : /* empty */
2629 | indiv_attr_event_subs indiv_attr_event_sub
2632 indiv_attr_event_sub : event_detail_sub
2636 /* INDIVIDUAL EVENT STRUCTURE */
2637 indiv_even_struc_sub : indiv_birt_sect
2639 | indiv_adop_sect /* 0:M */
2640 | indiv_even_sect /* 0:M */
2643 indiv_birt_sect : OPEN DELIM indiv_birt_tag opt_value
2645 = start_element(ELT_SUB_INDIV_BIRT,
2647 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2648 START2($1, $<ctxt>$);
2653 { end_element(ELT_SUB_INDIV_BIRT, PARENT, $<ctxt>5,
2654 GEDCOM_MAKE_NULL(val1));
2658 indiv_birt_tag : TAG_BIRT { $$ = $1; START1(BIRT) }
2659 | TAG_CHR { $$ = $1; START1(CHR) }
2662 indiv_birt_subs : /* empty */
2663 | indiv_birt_subs indiv_birt_sub
2666 indiv_birt_sub : event_detail_sub
2667 | indiv_birt_famc_sect { OCCUR2(FAMC,0, 1) }
2671 indiv_birt_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2672 { struct xref_value *xr = gedcom_parse_xref($4,
2675 if (xr == NULL) HANDLE_ERROR;
2677 = start_element(ELT_SUB_INDIV_BIRT_FAMC,
2679 GEDCOM_MAKE_XREF_PTR(val1, xr));
2680 START(FAMC, $1, $<ctxt>$)
2685 { end_element(ELT_SUB_INDIV_BIRT_FAMC, PARENT, $<ctxt>5,
2686 GEDCOM_MAKE_NULL(val1));
2690 indiv_gen_sect : OPEN DELIM indiv_gen_tag opt_value
2692 = start_element(ELT_SUB_INDIV_GEN,
2694 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2695 START2($1, $<ctxt>$);
2700 { end_element(ELT_SUB_INDIV_GEN, PARENT, $<ctxt>5,
2701 GEDCOM_MAKE_NULL(val1));
2705 indiv_gen_tag : TAG_DEAT { $$ = $1; START1(DEAT) }
2706 | TAG_BURI { $$ = $1; START1(BURI) }
2707 | TAG_CREM { $$ = $1; START1(CREM) }
2708 | TAG_BAPM { $$ = $1; START1(BAPM) }
2709 | TAG_BARM { $$ = $1; START1(BARM) }
2710 | TAG_BASM { $$ = $1; START1(BASM) }
2711 | TAG_BLES { $$ = $1; START1(BLES) }
2712 | TAG_CHRA { $$ = $1; START1(CHRA) }
2713 | TAG_CONF { $$ = $1; START1(CONF) }
2714 | TAG_FCOM { $$ = $1; START1(FCOM) }
2715 | TAG_ORDN { $$ = $1; START1(ORDN) }
2716 | TAG_NATU { $$ = $1; START1(NATU) }
2717 | TAG_EMIG { $$ = $1; START1(EMIG) }
2718 | TAG_IMMI { $$ = $1; START1(IMMI) }
2719 | TAG_CENS { $$ = $1; START1(CENS) }
2720 | TAG_PROB { $$ = $1; START1(PROB) }
2721 | TAG_WILL { $$ = $1; START1(WILL) }
2722 | TAG_GRAD { $$ = $1; START1(GRAD) }
2723 | TAG_RETI { $$ = $1; START1(RETI) }
2726 indiv_gen_subs : /* empty */
2727 | indiv_gen_subs indiv_gen_sub
2730 indiv_gen_sub : event_detail_sub
2734 indiv_adop_sect : OPEN DELIM TAG_ADOP opt_value
2736 = start_element(ELT_SUB_INDIV_ADOP,
2738 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2739 START(ADOP, $1, $<ctxt>$) }
2743 { end_element(ELT_SUB_INDIV_ADOP, PARENT, $<ctxt>5,
2744 GEDCOM_MAKE_NULL(val1));
2748 indiv_adop_subs : /* empty */
2749 | indiv_adop_subs indiv_adop_sub
2752 indiv_adop_sub : event_detail_sub
2753 | indiv_adop_famc_sect { OCCUR2(FAMC,0, 1) }
2757 indiv_adop_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2758 { struct xref_value *xr = gedcom_parse_xref($4,
2761 if (xr == NULL) HANDLE_ERROR;
2763 = start_element(ELT_SUB_INDIV_ADOP_FAMC,
2765 GEDCOM_MAKE_XREF_PTR(val1, xr));
2766 START(FAMC, $1, $<ctxt>$) }
2767 indiv_adop_famc_subs
2770 { end_element(ELT_SUB_INDIV_ADOP_FAMC, PARENT, $<ctxt>5,
2771 GEDCOM_MAKE_NULL(val1));
2775 indiv_adop_famc_subs : /* empty */
2776 | indiv_adop_famc_subs indiv_adop_famc_sub
2779 indiv_adop_famc_sub : indiv_adop_famc_adop_sect { OCCUR2(ADOP,0, 1) }
2783 indiv_adop_famc_adop_sect : OPEN DELIM TAG_ADOP mand_line_item
2785 = start_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2787 GEDCOM_MAKE_STRING(val1, $4));
2788 START(ADOP, $1, $<ctxt>$) }
2792 { end_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2794 GEDCOM_MAKE_NULL(val1));
2798 indiv_even_sect : OPEN DELIM TAG_EVEN
2799 { $<ctxt>$ = start_element(ELT_SUB_INDIV_EVEN,
2800 PARENT, $1, $3, NULL,
2801 GEDCOM_MAKE_NULL(val1));
2802 START(EVEN, $1, $<ctxt>$) }
2806 { end_element(ELT_SUB_INDIV_EVEN, PARENT, $<ctxt>4,
2807 GEDCOM_MAKE_NULL(val1));
2811 /* LDS INDIVIDUAL ORDINANCE */
2812 lds_indiv_ord_sub : lio_bapl_sect /* 0:M */
2813 | lio_slgc_sect /* 0:M */
2816 lio_bapl_sect : OPEN DELIM lio_bapl_tag
2817 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL,
2818 PARENT, $1, $3, NULL,
2819 GEDCOM_MAKE_NULL(val1));
2820 START2($1, $<ctxt>$);
2825 { end_element(ELT_SUB_LIO_BAPL, PARENT, $<ctxt>4,
2826 GEDCOM_MAKE_NULL(val1));
2830 lio_bapl_tag : TAG_BAPL { $$ = $1; START1(BAPL) }
2831 | TAG_CONL { $$ = $1; START1(CONL) }
2832 | TAG_ENDL { $$ = $1; START1(ENDL) }
2835 lio_bapl_subs : /* empty */
2836 | lio_bapl_subs lio_bapl_sub
2839 lio_bapl_sub : lio_bapl_stat_sect { OCCUR2(STAT, 0, 1) }
2840 | lio_bapl_date_sect { OCCUR2(DATE, 0, 1) }
2841 | lio_bapl_temp_sect { OCCUR2(TEMP, 0, 1) }
2842 | lio_bapl_plac_sect { OCCUR2(PLAC, 0, 1) }
2848 lio_bapl_stat_sect : OPEN DELIM TAG_STAT mand_line_item
2849 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_STAT,
2851 GEDCOM_MAKE_STRING(val1, $4));
2852 START(STAT, $1, $<ctxt>$)
2857 { end_element(ELT_SUB_LIO_BAPL_STAT, PARENT, $<ctxt>5,
2858 GEDCOM_MAKE_NULL(val1));
2861 lio_bapl_date_sect : OPEN DELIM TAG_DATE mand_line_item
2862 { struct date_value dv = gedcom_parse_date($4);
2863 $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_DATE,
2865 GEDCOM_MAKE_DATE(val1, dv));
2866 START(DATE, $1, $<ctxt>$)
2871 { end_element(ELT_SUB_LIO_BAPL_DATE, PARENT, $<ctxt>5,
2872 GEDCOM_MAKE_NULL(val1));
2875 lio_bapl_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
2876 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_TEMP,
2878 GEDCOM_MAKE_STRING(val1, $4));
2879 START(TEMP, $1, $<ctxt>$)
2884 { end_element(ELT_SUB_LIO_BAPL_TEMP, PARENT, $<ctxt>5,
2885 GEDCOM_MAKE_NULL(val1));
2888 lio_bapl_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
2889 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_PLAC,
2891 GEDCOM_MAKE_STRING(val1, $4));
2892 START(PLAC, $1, $<ctxt>$)
2897 { end_element(ELT_SUB_LIO_BAPL_PLAC, PARENT, $<ctxt>5,
2898 GEDCOM_MAKE_NULL(val1));
2902 lio_slgc_sect : OPEN DELIM TAG_SLGC
2903 { $<ctxt>$ = start_element(ELT_SUB_LIO_SLGC,
2904 PARENT, $1, $3, NULL,
2905 GEDCOM_MAKE_NULL(val1));
2906 START(SLGC, $1, $<ctxt>$)
2909 { if (compat_mode(C_NO_SLGC_FAMC) && ! CHK_COND(FAMC))
2910 compat_generate_slgc_famc_link($<ctxt>4);
2915 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4,
2916 GEDCOM_MAKE_NULL(val1));
2920 lio_slgc_subs : /* empty */
2921 | lio_slgc_subs lio_slgc_sub
2924 lio_slgc_sub : lio_bapl_sub
2925 | lio_slgc_famc_sect { OCCUR2(FAMC, 1, 1) }
2928 lio_slgc_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2929 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2931 if (xr == NULL) HANDLE_ERROR;
2933 = start_element(ELT_SUB_LIO_SLGC_FAMC,
2935 GEDCOM_MAKE_XREF_PTR(val1, xr));
2936 START(FAMC, $1, $<ctxt>$)
2941 { end_element(ELT_SUB_LIO_SLGC_FAMC, PARENT, $<ctxt>5,
2942 GEDCOM_MAKE_NULL(val1));
2946 /* LDS SPOUSE SEALING */
2947 lds_spouse_seal_sub : lss_slgs_sect
2950 lss_slgs_sect : OPEN DELIM TAG_SLGS
2951 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS,
2952 PARENT, $1, $3, NULL,
2953 GEDCOM_MAKE_NULL(val1));
2954 START(SLGS, $1, $<ctxt>$) }
2958 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4,
2959 GEDCOM_MAKE_NULL(val1));
2963 lss_slgs_subs : /* empty */
2964 | lss_slgs_subs lss_slgs_sub
2967 lss_slgs_sub : lss_slgs_stat_sect { OCCUR2(STAT, 0, 1) }
2968 | lss_slgs_date_sect { OCCUR2(DATE, 0, 1) }
2969 | lss_slgs_temp_sect { OCCUR2(TEMP, 0, 1) }
2970 | lss_slgs_plac_sect { OCCUR2(PLAC, 0, 1) }
2976 lss_slgs_stat_sect : OPEN DELIM TAG_STAT mand_line_item
2977 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_STAT,
2979 GEDCOM_MAKE_STRING(val1, $4));
2980 START(STAT, $1, $<ctxt>$)
2985 { end_element(ELT_SUB_LSS_SLGS_STAT, PARENT, $<ctxt>5,
2986 GEDCOM_MAKE_NULL(val1));
2989 lss_slgs_date_sect : OPEN DELIM TAG_DATE mand_line_item
2990 { struct date_value dv = gedcom_parse_date($4);
2991 $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_DATE,
2993 GEDCOM_MAKE_DATE(val1, dv));
2994 START(DATE, $1, $<ctxt>$)
2999 { end_element(ELT_SUB_LSS_SLGS_DATE, PARENT, $<ctxt>5,
3000 GEDCOM_MAKE_NULL(val1));
3003 lss_slgs_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
3004 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_TEMP,
3006 GEDCOM_MAKE_STRING(val1, $4));
3007 START(TEMP, $1, $<ctxt>$)
3012 { end_element(ELT_SUB_LSS_SLGS_TEMP, PARENT, $<ctxt>5,
3013 GEDCOM_MAKE_NULL(val1));
3016 lss_slgs_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
3017 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_PLAC,
3019 GEDCOM_MAKE_STRING(val1, $4));
3020 START(PLAC, $1, $<ctxt>$)
3025 { end_element(ELT_SUB_LSS_SLGS_PLAC, PARENT, $<ctxt>5,
3026 GEDCOM_MAKE_NULL(val1));
3030 /* MULTIMEDIA LINK */
3031 multim_link_sub : multim_obje_link_sect
3032 | multim_obje_emb_sect
3035 multim_obje_link_sect : OPEN DELIM TAG_OBJE DELIM POINTER
3036 { struct xref_value *xr = gedcom_parse_xref($5,
3039 if (xr == NULL) HANDLE_ERROR;
3041 = start_element(ELT_SUB_MULTIM_OBJE,
3043 GEDCOM_MAKE_XREF_PTR(val1, xr));
3044 START(OBJE, $1, $<ctxt>$)
3049 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>6,
3050 GEDCOM_MAKE_NULL(val1));
3054 multim_obje_emb_sect : OPEN DELIM TAG_OBJE
3055 { $<ctxt>$ = start_element(ELT_SUB_MULTIM_OBJE,
3056 PARENT, $1, $3, NULL,
3057 GEDCOM_MAKE_NULL(val1));
3058 START(OBJE, $1, $<ctxt>$)
3060 multim_obje_emb_subs
3061 { CHECK2(FORM,FILE) }
3063 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>4,
3064 GEDCOM_MAKE_NULL(val1));
3068 multim_obje_emb_subs : /* empty */
3069 | multim_obje_emb_subs multim_obje_emb_sub
3072 multim_obje_emb_sub : multim_obje_form_sect { OCCUR2(FORM, 1, 1) }
3073 | multim_obje_titl_sect { OCCUR2(TITL, 0, 1) }
3074 | multim_obje_file_sect { OCCUR2(FILE, 1, 1) }
3079 multim_obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
3081 = start_element(ELT_SUB_MULTIM_OBJE_FORM,
3083 GEDCOM_MAKE_STRING(val1, $4));
3084 START(FORM, $1, $<ctxt>$)
3089 { end_element(ELT_SUB_MULTIM_OBJE_FORM,
3091 GEDCOM_MAKE_NULL(val1));
3094 multim_obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
3096 = start_element(ELT_SUB_MULTIM_OBJE_TITL,
3098 GEDCOM_MAKE_STRING(val1, $4));
3099 START(TITL, $1, $<ctxt>$)
3104 { end_element(ELT_SUB_MULTIM_OBJE_TITL,
3106 GEDCOM_MAKE_NULL(val1));
3109 multim_obje_file_sect : OPEN DELIM TAG_FILE mand_line_item
3111 = start_element(ELT_SUB_MULTIM_OBJE_FILE,
3113 GEDCOM_MAKE_STRING(val1, $4));
3114 START(FILE, $1, $<ctxt>$)
3119 { end_element(ELT_SUB_MULTIM_OBJE_FILE,
3121 GEDCOM_MAKE_NULL(val1));
3125 /* NOTE STRUCTURE */
3126 note_struc_sub : note_struc_link_sect /* 0:M */
3127 | note_struc_emb_sect /* 0:M */
3130 note_struc_link_sect : OPEN DELIM TAG_NOTE DELIM POINTER
3131 { struct xref_value *xr = gedcom_parse_xref($5,
3134 if (xr == NULL) HANDLE_ERROR;
3136 = start_element(ELT_SUB_NOTE,
3138 GEDCOM_MAKE_XREF_PTR(val1, xr));
3139 START(NOTE, $1, $<ctxt>$)
3141 note_struc_link_subs
3144 { end_element(ELT_SUB_NOTE, PARENT, $<ctxt>6,
3145 GEDCOM_MAKE_NULL(val1));
3149 note_struc_link_subs : /* empty */
3150 | note_struc_link_subs note_struc_link_sub
3153 note_struc_link_sub : source_cit_sub
3157 note_struc_emb_sect : OPEN DELIM TAG_NOTE opt_line_item
3159 = start_element(ELT_SUB_NOTE,
3161 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
3162 reset_buffer(&concat_buffer);
3164 safe_buf_append(&concat_buffer, $4);
3165 START(NOTE, $1, $<ctxt>$)
3170 { char* complete = get_buf_string(&concat_buffer);
3171 end_element(ELT_SUB_NOTE, PARENT, $<ctxt>5,
3172 GEDCOM_MAKE_STRING(val1, complete));
3176 note_struc_emb_subs : /* empty */
3177 | note_struc_emb_subs note_struc_emb_sub
3180 note_struc_emb_sub : continuation_sub
3185 /* PERSONAL NAME STRUCTURE */
3186 pers_name_struc_sub : pers_name_sect /* 0:M */
3189 pers_name_sect : OPEN DELIM TAG_NAME mand_line_item
3190 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME,
3192 GEDCOM_MAKE_STRING(val1, $4));
3193 START(NAME, $1, $<ctxt>$)
3198 { end_element(ELT_SUB_PERS_NAME, PARENT, $<ctxt>5,
3199 GEDCOM_MAKE_NULL(val1));
3203 pers_name_subs : /* empty */
3204 | pers_name_subs pers_name_sub
3207 pers_name_sub : pers_name_npfx_sect { OCCUR2(NPFX, 0, 1) }
3208 | pers_name_givn_sect { OCCUR2(GIVN, 0, 1) }
3209 | pers_name_nick_sect { OCCUR2(NICK, 0, 1) }
3210 | pers_name_spfx_sect { OCCUR2(SPFX, 0, 1) }
3211 | pers_name_surn_sect { OCCUR2(SURN, 0, 1) }
3212 | pers_name_nsfx_sect { OCCUR2(NSFX, 0, 1) }
3218 pers_name_npfx_sect : OPEN DELIM TAG_NPFX mand_line_item
3219 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NPFX,
3221 GEDCOM_MAKE_STRING(val1, $4));
3222 START(NPFX, $1, $<ctxt>$)
3227 { end_element(ELT_SUB_PERS_NAME_NPFX, PARENT, $<ctxt>5,
3228 GEDCOM_MAKE_NULL(val1));
3231 pers_name_givn_sect : OPEN DELIM TAG_GIVN mand_line_item
3232 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_GIVN,
3234 GEDCOM_MAKE_STRING(val1, $4));
3235 START(GIVN, $1, $<ctxt>$)
3240 { end_element(ELT_SUB_PERS_NAME_GIVN, PARENT, $<ctxt>5,
3241 GEDCOM_MAKE_NULL(val1));
3244 pers_name_nick_sect : OPEN DELIM TAG_NICK mand_line_item
3245 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NICK,
3247 GEDCOM_MAKE_STRING(val1, $4));
3248 START(NICK, $1, $<ctxt>$)
3253 { end_element(ELT_SUB_PERS_NAME_NICK, PARENT, $<ctxt>5,
3254 GEDCOM_MAKE_NULL(val1));
3257 pers_name_spfx_sect : OPEN DELIM TAG_SPFX mand_line_item
3258 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SPFX,
3260 GEDCOM_MAKE_STRING(val1, $4));
3261 START(SPFX, $1, $<ctxt>$)
3266 { end_element(ELT_SUB_PERS_NAME_SPFX, PARENT, $<ctxt>5,
3267 GEDCOM_MAKE_NULL(val1));
3270 pers_name_surn_sect : OPEN DELIM TAG_SURN mand_line_item
3271 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SURN,
3273 GEDCOM_MAKE_STRING(val1, $4));
3274 START(SURN, $1, $<ctxt>$)
3279 { end_element(ELT_SUB_PERS_NAME_SURN, PARENT, $<ctxt>5,
3280 GEDCOM_MAKE_NULL(val1));
3283 pers_name_nsfx_sect : OPEN DELIM TAG_NSFX mand_line_item
3284 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NSFX,
3286 GEDCOM_MAKE_STRING(val1, $4));
3287 START(NSFX, $1, $<ctxt>$)
3292 { end_element(ELT_SUB_PERS_NAME_NSFX, PARENT, $<ctxt>5,
3293 GEDCOM_MAKE_NULL(val1));
3297 /* PLACE STRUCTURE */
3298 place_struc_sub : place_struc_plac_sect /* 0:M */
3301 place_struc_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
3303 = start_element(ELT_SUB_PLAC,
3305 GEDCOM_MAKE_STRING(val1, $4));
3306 START(PLAC, $1, $<ctxt>$)
3308 place_struc_plac_subs
3311 { end_element(ELT_SUB_PLAC, PARENT, $<ctxt>5,
3312 GEDCOM_MAKE_NULL(val1));
3316 place_struc_plac_subs : /* empty */
3317 | place_struc_plac_subs place_struc_plac_sub
3320 place_struc_plac_sub : place_plac_form_sect { OCCUR2(FORM, 0, 1) }
3326 place_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
3328 = start_element(ELT_SUB_PLAC_FORM,
3330 GEDCOM_MAKE_STRING(val1, $4));
3331 START(FORM, $1, $<ctxt>$)
3336 { end_element(ELT_SUB_PLAC_FORM, PARENT, $<ctxt>5,
3337 GEDCOM_MAKE_NULL(val1));
3341 /* SOURCE_CITATION */
3342 source_cit_sub : source_cit_link_sect /* 0:M */
3343 | source_cit_emb_sect /* 0:M */
3346 source_cit_link_sect : OPEN DELIM TAG_SOUR DELIM POINTER
3347 { struct xref_value *xr = gedcom_parse_xref($5,
3350 if (xr == NULL) HANDLE_ERROR;
3352 = start_element(ELT_SUB_SOUR,
3354 GEDCOM_MAKE_XREF_PTR(val1, xr));
3355 START(SOUR, $1, $<ctxt>$)
3357 source_cit_link_subs
3360 { end_element(ELT_SUB_SOUR, PARENT, $<ctxt>6,
3361 GEDCOM_MAKE_NULL(val1));
3365 source_cit_link_subs : /* empty */
3366 | source_cit_link_subs source_cit_link_sub
3369 source_cit_link_sub : source_cit_page_sect { OCCUR2(PAGE, 0, 1) }
3370 | source_cit_even_sect { OCCUR2(EVEN, 0, 1) }
3371 | source_cit_data_sect { OCCUR2(DATA, 0, 1) }
3372 | source_cit_quay_sect { OCCUR2(QUAY, 0, 1) }
3378 source_cit_page_sect : OPEN DELIM TAG_PAGE mand_line_item
3380 = start_element(ELT_SUB_SOUR_PAGE,
3382 GEDCOM_MAKE_STRING(val1, $4));
3383 START(PAGE, $1, $<ctxt>$)
3388 { end_element(ELT_SUB_SOUR_PAGE, PARENT, $<ctxt>5,
3389 GEDCOM_MAKE_NULL(val1));
3393 source_cit_even_sect : OPEN DELIM TAG_EVEN mand_line_item
3395 = start_element(ELT_SUB_SOUR_EVEN,
3397 GEDCOM_MAKE_STRING(val1, $4));
3398 START(EVEN, $1, $<ctxt>$)
3400 source_cit_even_subs
3403 { end_element(ELT_SUB_SOUR_EVEN, PARENT, $<ctxt>5,
3404 GEDCOM_MAKE_NULL(val1));
3408 source_cit_even_subs : /* empty */
3409 | source_cit_even_subs source_cit_even_sub
3412 source_cit_even_sub : source_cit_even_role_sect { OCCUR2(ROLE, 0, 1) }
3416 source_cit_even_role_sect : OPEN DELIM TAG_ROLE mand_line_item
3418 = start_element(ELT_SUB_SOUR_EVEN_ROLE,
3420 GEDCOM_MAKE_STRING(val1, $4));
3421 START(ROLE, $1, $<ctxt>$)
3426 { end_element(ELT_SUB_SOUR_EVEN_ROLE,
3428 GEDCOM_MAKE_NULL(val1));
3432 source_cit_data_sect : OPEN DELIM TAG_DATA
3433 { $<ctxt>$ = start_element(ELT_SUB_SOUR_DATA,
3434 PARENT, $1, $3, NULL,
3435 GEDCOM_MAKE_NULL(val1));
3436 START(DATA, $1, $<ctxt>$)
3438 source_cit_data_subs
3441 { end_element(ELT_SUB_SOUR_DATA, PARENT, $<ctxt>4,
3442 GEDCOM_MAKE_NULL(val1));
3446 source_cit_data_subs : /* empty */
3447 | source_cit_data_subs source_cit_data_sub
3450 source_cit_data_sub : source_cit_data_date_sect { OCCUR2(DATE, 0, 1) }
3451 | source_cit_text_sect /* 0:M */
3455 source_cit_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
3456 { struct date_value dv = gedcom_parse_date($4);
3458 = start_element(ELT_SUB_SOUR_DATA_DATE,
3460 GEDCOM_MAKE_DATE(val1, dv));
3461 START(DATE, $1, $<ctxt>$)
3466 { end_element(ELT_SUB_SOUR_DATA_DATE,
3468 GEDCOM_MAKE_NULL(val1));
3472 source_cit_text_sect : OPEN DELIM TAG_TEXT mand_line_item
3474 = start_element(ELT_SUB_SOUR_TEXT,
3476 GEDCOM_MAKE_STRING(val1, $4));
3477 reset_buffer(&concat_buffer);
3478 safe_buf_append(&concat_buffer, $4);
3479 START(TEXT, $1, $<ctxt>$)
3481 source_cit_text_subs
3484 { char* complete = get_buf_string(&concat_buffer);
3485 end_element(ELT_SUB_SOUR_TEXT, PARENT, $<ctxt>5,
3486 GEDCOM_MAKE_STRING(val1, complete));
3490 source_cit_text_subs : /* empty */
3491 | source_cit_text_subs source_cit_text_sub
3494 source_cit_text_sub : continuation_sub
3498 source_cit_quay_sect : OPEN DELIM TAG_QUAY mand_line_item
3500 = start_element(ELT_SUB_SOUR_QUAY,
3502 GEDCOM_MAKE_STRING(val1, $4));
3503 START(QUAY, $1, $<ctxt>$)
3508 { end_element(ELT_SUB_SOUR_QUAY, PARENT, $<ctxt>5,
3509 GEDCOM_MAKE_NULL(val1));
3513 source_cit_emb_sect : OPEN DELIM TAG_SOUR mand_line_item
3514 { $<ctxt>$ = start_element(ELT_SUB_SOUR,
3516 GEDCOM_MAKE_STRING(val1, $4));
3517 reset_buffer(&concat_buffer);
3518 safe_buf_append(&concat_buffer, $4);
3519 START(SOUR, $1, $<ctxt>$)
3524 { char* complete = get_buf_string(&concat_buffer);
3525 end_element(ELT_SUB_SOUR, PARENT, $<ctxt>5,
3526 GEDCOM_MAKE_STRING(val1, complete));
3530 source_cit_emb_subs : /* empty */
3531 | source_cit_emb_subs source_cit_emb_sub
3534 source_cit_emb_sub : continuation_sub
3535 | source_cit_text_sect /* 0:M */
3540 /* SOURCE REPOSITORY CITATION */
3541 source_repos_cit_sub : source_repos_repo_sect { OCCUR2(REPO, 0, 1) }
3544 source_repos_repo_sect : OPEN DELIM TAG_REPO mand_pointer
3545 { struct xref_value *xr
3546 = gedcom_parse_xref($4, XREF_USED, XREF_REPO);
3547 if (xr == NULL) HANDLE_ERROR;
3549 = start_element(ELT_SUB_REPO,
3551 GEDCOM_MAKE_XREF_PTR(val1, xr));
3552 START(REPO, $1, $<ctxt>$)
3554 source_repos_repo_subs
3557 { end_element(ELT_SUB_REPO, PARENT, $<ctxt>5,
3558 GEDCOM_MAKE_NULL(val1));
3562 source_repos_repo_subs : /* empty */
3563 | source_repos_repo_subs source_repos_repo_sub
3566 source_repos_repo_sub : note_struc_sub
3567 | caln_sect /* 0:M */
3571 caln_sect : OPEN DELIM TAG_CALN mand_line_item
3572 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN,
3574 GEDCOM_MAKE_STRING(val1, $4));
3575 START(CALN, $1, $<ctxt>$)
3580 { end_element(ELT_SUB_REPO_CALN, PARENT, $<ctxt>5,
3581 GEDCOM_MAKE_NULL(val1));
3585 caln_subs : /* empty */
3586 | caln_subs caln_sub
3589 caln_sub : caln_medi_sect { OCCUR2(MEDI, 0, 1) }
3593 caln_medi_sect : OPEN DELIM TAG_MEDI mand_line_item
3594 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN_MEDI,
3596 GEDCOM_MAKE_STRING(val1, $4));
3597 START(MEDI, $1, $<ctxt>$)
3602 { end_element(ELT_SUB_REPO_CALN_MEDI, PARENT, $<ctxt>5,
3603 GEDCOM_MAKE_NULL(val1));
3607 /* SPOUSE TO FAMILY LINK */
3608 spou_fam_link_sub : spou_fam_fams_sect /* 0:M */
3611 spou_fam_fams_sect : OPEN DELIM TAG_FAMS mand_pointer
3612 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
3614 if (xr == NULL) HANDLE_ERROR;
3616 = start_element(ELT_SUB_FAMS,
3618 GEDCOM_MAKE_XREF_PTR(val1, xr));
3619 START(FAMS, $1, $<ctxt>$)
3624 { end_element(ELT_SUB_FAMS, PARENT, $<ctxt>5,
3625 GEDCOM_MAKE_NULL(val1));
3629 spou_fam_fams_subs : /* empty */
3630 | spou_fam_fams_subs spou_fam_fams_sub
3633 spou_fam_fams_sub : note_struc_sub
3637 /*********************************************************************/
3639 /*********************************************************************/
3641 no_std_subs : /* empty */
3642 | no_std_subs no_std_sub
3645 no_std_sub : user_sect /* 0:M */
3648 CLOSE { HANDLE_ERROR }
3651 no_std_rec : user_rec /* 0:M */
3654 CLOSE { HANDLE_ERROR }
3657 user_rec : OPEN DELIM opt_xref USERTAG
3658 { if ($4.string[0] != '_') {
3659 if (compat_mode(C_551_TAGS)
3660 && compat_check_551_tag($4.string, &usertag_buffer)) {
3661 $4.string = get_buf_string(&usertag_buffer);
3664 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3671 { struct xref_value *xr = NULL;
3673 xr = gedcom_parse_xref($3, XREF_DEFINED, XREF_USER);
3674 if (xr == NULL) HANDLE_ERROR;
3676 $<ctxt>$ = start_record(REC_USER,
3678 GEDCOM_MAKE_NULL_OR_XREF_PTR(val1, xr),
3680 START($4, $1, $<ctxt>$)
3685 { end_record(REC_USER, $<ctxt>7, GEDCOM_MAKE_NULL(val1)); }
3687 user_sect : OPEN DELIM opt_xref USERTAG
3688 { if ($4.string[0] != '_') {
3689 if (compat_mode(C_551_TAGS)
3690 && compat_check_551_tag($4.string, &usertag_buffer)) {
3691 $4.string = get_buf_string(&usertag_buffer);
3693 else if (compat_mode(C_SUBM_COMM) &&
3694 compat_check_subm_comm($4.string, get_parenttag(0),
3696 $4.string = get_buf_string(&usertag_buffer);
3699 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3706 { $<ctxt>$ = start_element(ELT_USER, PARENT, $1, $4, $6, &val2);
3707 START($4, $1, $<ctxt>$);
3712 { end_element(ELT_USER, PARENT, $<ctxt>7,
3713 GEDCOM_MAKE_NULL(val1));
3714 if (compat_mode(C_SUBM_COMM))
3715 compat_close_subm_comm();
3719 user_sects : /* empty */ { }
3720 | user_sects user_sect { }
3721 | user_sects gen_sect
3722 { if (compat_mode(C_SUBM_COMM)) {
3725 gedcom_error(_("Standard tag not allowed in user section"));
3731 opt_xref : /* empty */ { $$ = NULL; }
3732 | POINTER DELIM { $$ = $1; }
3735 opt_value : /* empty */ { GEDCOM_MAKE_NULL(val2);
3737 | DELIM POINTER { struct xref_value *xr
3738 = gedcom_parse_xref($2, XREF_USED,
3740 GEDCOM_MAKE_XREF_PTR(val2, xr);
3742 | DELIM line_item { GEDCOM_MAKE_STRING(val2, $2);
3746 mand_pointer : /* empty */ { gedcom_error(_("Missing pointer")); YYERROR; }
3747 | DELIM POINTER { gedcom_debug_print("==Ptr: %s==", $2);
3751 mand_line_item : /* empty */
3752 { if (compat_mode(C_NO_REQUIRED_VALUES)) {
3753 gedcom_debug_print("==Val: ==");
3757 gedcom_error(_("Missing value")); YYERROR;
3760 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3764 opt_line_item : /* empty */ { $$ = NULL; }
3765 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3769 line_item : anychar { size_t i;
3770 reset_buffer(&line_item_buffer);
3771 /* The following also takes care of '@@' */
3772 if (!strncmp($1, "@@", 3))
3773 SAFE_BUF_ADDCHAR(&line_item_buffer, '@')
3775 for (i=0; i < strlen($1); i++)
3776 SAFE_BUF_ADDCHAR(&line_item_buffer, $1[i])
3777 $$ = get_buf_string(&line_item_buffer);
3779 | ESCAPE { size_t i;
3780 reset_buffer(&line_item_buffer);
3781 for (i=0; i < strlen($1); i++)
3782 SAFE_BUF_ADDCHAR(&line_item_buffer, $1[i])
3783 $$ = get_buf_string(&line_item_buffer);
3787 /* The following also takes care of '@@' */
3788 if (!strncmp($2, "@@", 3))
3789 SAFE_BUF_ADDCHAR(&line_item_buffer, '@')
3791 for (i=0; i < strlen($2); i++)
3792 SAFE_BUF_ADDCHAR(&line_item_buffer, $2[i])
3793 $$ = get_buf_string(&line_item_buffer);
3797 for (i=0; i < strlen($2); i++)
3798 SAFE_BUF_ADDCHAR(&line_item_buffer, $2[i])
3799 $$ = get_buf_string(&line_item_buffer);
3801 | line_item error anychar { HANDLE_ERROR; }
3802 | line_item error ESCAPE { HANDLE_ERROR; }
3805 anychar : ANYCHAR { }
3809 error_subs : /* empty */
3810 | error_subs error_sect
3813 error_sect : OPEN DELIM opt_xref anytag opt_value error_subs CLOSE { }
3816 gen_sect : OPEN DELIM opt_xref anystdtag
3817 { if (compat_mode(C_SUBM_COMM)
3818 && compat_check_subm_comm_cont($4.string)) {
3819 /* Will pass here */
3822 INVALID_TAG($4.string);
3826 { if (compat_mode(C_SUBM_COMM)) {
3827 $<ctxt>$ = compat_subm_comm_cont_start(PARENT, $6);
3831 { if (compat_mode(C_SUBM_COMM))
3832 compat_subm_comm_cont_end(PARENT, $<ctxt>7);
3836 gen_rec : gen_rec_top
3840 gen_rec_norm : OPEN DELIM opt_xref anystdtag
3841 { INVALID_TOP_TAG($4.string) }
3842 opt_value opt_sects CLOSE
3846 gen_rec_top : OPEN DELIM anytoptag
3847 { gedcom_error(_("Missing cross-reference")); YYERROR; }
3848 opt_value opt_sects CLOSE
3852 opt_sects : /* empty */ { }
3853 | opt_sects gen_sect { }
3856 anytag : USERTAG { }
3870 anystdtag : TAG_ABBR
4001 /* Functions that handle the counting of subtags */
4003 int* count_arrays[MAXGEDCLEVEL+1];
4004 char tag_stack[MAXGEDCLEVEL+1][MAXSTDTAGLEN+1];
4005 Gedcom_ctxt ctxt_stack[MAXGEDCLEVEL+1];
4007 void push_countarray(int level)
4010 gedcom_debug_print("Push Count level: %d, level: %d", count_level, level);
4011 if (count_level != level + 1) {
4012 gedcom_error(_("Internal error: count level mismatch"));
4015 if (count_level > MAXGEDCLEVEL) {
4016 gedcom_error(_("Internal error: count array overflow"));
4020 gedcom_debug_print("calloc countarray %d", count_level);
4021 count = (int *)calloc(YYNTOKENS, sizeof(int));
4022 if (count == NULL) {
4023 gedcom_error(_("Internal error: count array calloc error"));
4027 count_arrays[count_level] = count;
4032 void set_parenttag(const char* tag)
4034 strncpy(tag_stack[count_level+1], tag, MAXSTDTAGLEN+1);
4037 void set_parentctxt(Gedcom_ctxt ctxt)
4039 ctxt_stack[count_level+1] = ctxt;
4042 char* get_parenttag(int offset)
4044 return tag_stack[count_level - offset];
4047 Gedcom_ctxt get_parentctxt(int offset)
4049 return ctxt_stack[count_level - offset];
4052 int count_tag(int tag)
4054 int *count = count_arrays[count_level];
4055 return ++count[tag - GEDCOMTAGOFFSET];
4058 int check_occurrence(int tag)
4060 int *count = count_arrays[count_level];
4061 return (count[tag - GEDCOMTAGOFFSET] > 0);
4064 void pop_countarray()
4067 gedcom_debug_print("Pop Count level: %d", count_level);
4068 if (count_level < 0) {
4069 gedcom_error(_("Internal error: count array underflow"));
4073 count = count_arrays[count_level];
4074 gedcom_debug_print("free countarray %d", count_level);
4076 count_arrays[count_level] = NULL;
4082 gedcom_debug_print("Cleanup countarrays");
4083 while (count_level > 0) {
4089 void cleanup_concat_buffer()
4091 cleanup_buffer(&concat_buffer);
4094 void cleanup_line_item_buffer()
4096 cleanup_buffer(&line_item_buffer);
4099 void cleanup_usertag_buffer()
4101 cleanup_buffer(&usertag_buffer);
4104 /* Enabling debug mode */
4105 /* level 0: no debugging */
4106 /* level 1: only internal */
4107 /* level 2: also bison */
4110 void gedcom_set_debug_level(int level, FILE* f)
4115 trace_output = stderr;
4117 gedcom_high_level_debug = 1;
4126 int gedcom_debug_print(const char* s, ...)
4129 if (gedcom_high_level_debug) {
4132 res = vfprintf(trace_output, s, ap);
4134 fprintf(trace_output, "\n");
4139 /* Setting the error mechanism */
4140 void gedcom_set_error_handling(Gedcom_err_mech mechanism)
4142 error_mechanism = mechanism;