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($4);
500 $<ctxt>$ = start_element(ELT_HEAD_SOUR, PARENT,
502 GEDCOM_MAKE_STRING(val1, $4));
503 START(SOUR, $1, $<ctxt>$)
508 { end_element(ELT_HEAD_SOUR, PARENT, $<ctxt>5,
509 GEDCOM_MAKE_NULL(val1)); }
512 head_sour_subs : /* empty */
513 | head_sour_subs head_sour_sub
516 head_sour_sub : head_sour_vers_sect { OCCUR2(VERS, 0, 1) }
517 | head_sour_name_sect { OCCUR2(NAME, 0, 1) }
518 | head_sour_corp_sect { OCCUR2(CORP, 0, 1) }
519 | head_sour_data_sect { OCCUR2(DATA, 0, 1) }
523 head_sour_vers_sect : OPEN DELIM TAG_VERS mand_line_item
524 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_VERS, PARENT,
526 GEDCOM_MAKE_STRING(val1, $4));
527 START(VERS, $1, $<ctxt>$)
532 { end_element(ELT_HEAD_SOUR_VERS,
533 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
536 head_sour_name_sect : OPEN DELIM TAG_NAME mand_line_item
537 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_NAME, PARENT,
539 GEDCOM_MAKE_STRING(val1, $4));
540 START(NAME, $1, $<ctxt>$)
545 { end_element(ELT_HEAD_SOUR_NAME,
546 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
549 head_sour_corp_sect : OPEN DELIM TAG_CORP mand_line_item
550 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_CORP, PARENT,
552 GEDCOM_MAKE_STRING(val1, $4));
553 START(CORP, $1, $<ctxt>$)
558 { end_element(ELT_HEAD_SOUR_CORP,
559 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
563 head_sour_corp_subs : /* empty */
564 | head_sour_corp_subs head_sour_corp_sub
567 head_sour_corp_sub : addr_struc_sub /* 0:1 */
571 head_sour_data_sect : OPEN DELIM TAG_DATA mand_line_item
572 { $<ctxt>$ = start_element(ELT_HEAD_SOUR_DATA, PARENT,
574 GEDCOM_MAKE_STRING(val1, $4));
575 START(DATA, $1, $<ctxt>$)
580 { end_element(ELT_HEAD_SOUR_DATA,
581 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
585 head_sour_data_subs : /* empty */
586 | head_sour_data_subs head_sour_data_sub
589 head_sour_data_sub : head_sour_data_date_sect { OCCUR2(DATE, 0, 1) }
590 | head_sour_data_copr_sect { OCCUR2(COPR, 0, 1) }
594 head_sour_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
595 { struct date_value dv = gedcom_parse_date($4);
597 = start_element(ELT_HEAD_SOUR_DATA_DATE,
599 GEDCOM_MAKE_DATE(val1, dv));
600 START(DATE, $1, $<ctxt>$)
605 { end_element(ELT_HEAD_SOUR_DATA_DATE,
607 GEDCOM_MAKE_NULL(val1));
610 head_sour_data_copr_sect : OPEN DELIM TAG_COPR mand_line_item
612 = start_element(ELT_HEAD_SOUR_DATA_COPR,
614 GEDCOM_MAKE_STRING(val1, $4));
615 START(COPR, $1, $<ctxt>$)
620 { end_element(ELT_HEAD_SOUR_DATA_COPR,
622 GEDCOM_MAKE_NULL(val1));
627 head_dest_sect : OPEN DELIM TAG_DEST mand_line_item
628 { $<ctxt>$ = start_element(ELT_HEAD_DEST,
630 GEDCOM_MAKE_STRING(val1, $4));
631 START(DEST, $1, $<ctxt>$)
636 { end_element(ELT_HEAD_DEST,
637 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
642 head_date_sect : OPEN DELIM TAG_DATE mand_line_item
643 { struct date_value dv = gedcom_parse_date($4);
644 $<ctxt>$ = start_element(ELT_HEAD_DATE,
646 GEDCOM_MAKE_DATE(val1, dv));
647 START(DATE, $1, $<ctxt>$)
652 { end_element(ELT_HEAD_DATE,
653 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
657 head_date_subs : /* empty */
658 | head_date_subs head_date_sub
661 head_date_sub : head_date_time_sect { OCCUR2(TIME, 0, 1) }
665 head_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
666 { $<ctxt>$ = start_element(ELT_HEAD_DATE_TIME,
668 GEDCOM_MAKE_STRING(val1, $4));
669 START(TIME, $1, $<ctxt>$)
674 { end_element(ELT_HEAD_DATE_TIME,
675 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
679 /* HEAD.TIME (Only for compatibility) */
680 /* Just ignore the time... */
681 head_time_sect : OPEN DELIM TAG_TIME opt_line_item CLOSE
682 { gedcom_warning(_("Header change time lost in the compatibility"));
687 head_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
688 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
690 if (xr == NULL) HANDLE_ERROR;
691 $<ctxt>$ = start_element(ELT_HEAD_SUBM,
693 GEDCOM_MAKE_XREF_PTR(val1, xr));
694 START(SUBM, $1, $<ctxt>$)
699 { end_element(ELT_HEAD_SUBM,
700 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
704 head_subn_sect : OPEN DELIM TAG_SUBN mand_pointer
705 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
707 if (xr == NULL) HANDLE_ERROR;
708 $<ctxt>$ = start_element(ELT_HEAD_SUBN,
710 GEDCOM_MAKE_XREF_PTR(val1, xr));
711 START(SUBN, $1, $<ctxt>$)
716 { end_element(ELT_HEAD_SUBN,
717 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
721 head_file_sect : OPEN DELIM TAG_FILE mand_line_item
722 { $<ctxt>$ = start_element(ELT_HEAD_FILE,
724 GEDCOM_MAKE_STRING(val1, $4));
725 START(FILE, $1, $<ctxt>$)
730 { end_element(ELT_HEAD_FILE, PARENT, $<ctxt>5,
731 GEDCOM_MAKE_NULL(val1));
735 head_copr_sect : OPEN DELIM TAG_COPR mand_line_item
736 { $<ctxt>$ = start_element(ELT_HEAD_COPR,
738 GEDCOM_MAKE_STRING(val1, $4));
739 START(COPR, $1, $<ctxt>$)
744 { end_element(ELT_HEAD_COPR, PARENT, $<ctxt>5,
745 GEDCOM_MAKE_NULL(val1));
749 head_gedc_sect : OPEN DELIM TAG_GEDC
750 { $<ctxt>$ = start_element(ELT_HEAD_GEDC,
751 PARENT, $1, $3, NULL,
752 GEDCOM_MAKE_NULL(val1));
753 START(GEDC, $1, $<ctxt>$)
756 { CHECK2(VERS, FORM) }
758 { end_element(ELT_HEAD_GEDC, PARENT, $<ctxt>4,
759 GEDCOM_MAKE_NULL(val1));
763 head_gedc_subs : /* empty */
764 | head_gedc_subs head_gedc_sub
767 head_gedc_sub : head_gedc_vers_sect { OCCUR2(VERS, 1, 1) }
768 | head_gedc_form_sect { OCCUR2(FORM, 1, 1) }
771 head_gedc_vers_sect : OPEN DELIM TAG_VERS mand_line_item
772 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_VERS,
774 GEDCOM_MAKE_STRING(val1, $4));
775 START(VERS, $1, $<ctxt>$)
780 { end_element(ELT_HEAD_GEDC_VERS,
781 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
784 head_gedc_form_sect : OPEN DELIM TAG_FORM mand_line_item
785 { $<ctxt>$ = start_element(ELT_HEAD_GEDC_FORM,
787 GEDCOM_MAKE_STRING(val1, $4));
788 START(FORM, $1, $<ctxt>$)
793 { end_element(ELT_HEAD_GEDC_FORM,
794 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
799 head_char_sect : OPEN DELIM TAG_CHAR mand_line_item
800 { /* Don't allow to continue if conversion context couldn't
802 if (open_conv_to_internal($4) == 0) HANDLE_ERROR;
803 $<ctxt>$ = start_element(ELT_HEAD_CHAR,
805 GEDCOM_MAKE_STRING(val1, $4));
806 START(CHAR, $1, $<ctxt>$)
811 { end_element(ELT_HEAD_CHAR, PARENT, $<ctxt>5,
812 GEDCOM_MAKE_NULL(val1));
816 head_char_subs : /* empty */
817 | head_char_subs head_char_sub
820 head_char_sub : head_char_vers_sect { OCCUR2(VERS, 0, 1) }
823 head_char_vers_sect : OPEN DELIM TAG_VERS mand_line_item
824 { $<ctxt>$ = start_element(ELT_HEAD_CHAR_VERS,
826 GEDCOM_MAKE_STRING(val1, $4));
827 START(VERS, $1, $<ctxt>$)
832 { end_element(ELT_HEAD_CHAR_VERS,
833 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
838 head_lang_sect : OPEN DELIM TAG_LANG mand_line_item
839 { $<ctxt>$ = start_element(ELT_HEAD_LANG,
841 GEDCOM_MAKE_STRING(val1, $4));
842 START(LANG, $1, $<ctxt>$)
847 { end_element(ELT_HEAD_LANG, PARENT, $<ctxt>5,
848 GEDCOM_MAKE_NULL(val1));
852 head_plac_sect : OPEN DELIM TAG_PLAC
853 { $<ctxt>$ = start_element(ELT_HEAD_PLAC,
854 PARENT, $1, $3, NULL,
855 GEDCOM_MAKE_NULL(val1));
856 START(PLAC, $1, $<ctxt>$)
861 { end_element(ELT_HEAD_PLAC, PARENT, $<ctxt>4,
862 GEDCOM_MAKE_NULL(val1));
866 head_plac_subs : /* empty */
867 | head_plac_subs head_plac_sub
870 head_plac_sub : head_plac_form_sect { OCCUR2(FORM, 1, 1) }
873 head_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
874 { $<ctxt>$ = start_element(ELT_HEAD_PLAC_FORM,
876 GEDCOM_MAKE_STRING(val1, $4));
877 START(FORM, $1, $<ctxt>$)
882 { end_element(ELT_HEAD_PLAC_FORM,
883 PARENT, $<ctxt>5, GEDCOM_MAKE_NULL(val1));
888 head_note_sect : OPEN DELIM TAG_NOTE mand_line_item
889 { $<ctxt>$ = start_element(ELT_HEAD_NOTE,
891 GEDCOM_MAKE_STRING(val1, $4));
892 reset_buffer(&concat_buffer);
893 safe_buf_append(&concat_buffer, $4);
894 START(NOTE, $1, $<ctxt>$)
899 { char* complete = get_buf_string(&concat_buffer);
900 end_element(ELT_HEAD_NOTE, PARENT, $<ctxt>5,
901 GEDCOM_MAKE_STRING(val1, complete));
905 head_note_subs : /* empty */
906 | head_note_subs head_note_sub
909 head_note_sub : continuation_sub /* 0:M */
913 /*********************************************************************/
915 /*********************************************************************/
916 /* Don't need callbacks here, there is no information... */
917 trlr_sect : OPEN DELIM TAG_TRLR CLOSE { }
920 /*********************************************************************/
921 /**** Family record ****/
922 /*********************************************************************/
923 fam_rec : OPEN DELIM POINTER DELIM TAG_FAM
924 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
926 if (xr == NULL) HANDLE_ERROR;
927 $<ctxt>$ = start_record(REC_FAM,
928 $1, GEDCOM_MAKE_XREF_PTR(val1, xr),
930 NULL, GEDCOM_MAKE_NULL(val2));
931 START(FAM, $1, $<ctxt>$) }
935 { end_record(REC_FAM, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
938 fam_subs : /* empty */
942 fam_sub : fam_event_struc_sub /* 0:M */
943 | fam_husb_sect { OCCUR2(HUSB, 0, 1) }
944 | fam_wife_sect { OCCUR2(WIFE, 0, 1) }
945 | fam_chil_sect /* 0:M */
946 | fam_nchi_sect { OCCUR2(NCHI, 0, 1) }
947 | fam_subm_sect /* 0:M */
948 | lds_spouse_seal_sub /* 0:M */
949 | source_cit_sub /* 0:M */
950 | multim_link_sub /* 0:M */
951 | note_struc_sub /* 0:M */
952 | ident_struc_sub /* 0:1 */
953 | change_date_sub /* 0:1 */
958 fam_husb_sect : OPEN DELIM TAG_HUSB mand_pointer
959 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
961 if (xr == NULL) HANDLE_ERROR;
962 $<ctxt>$ = start_element(ELT_FAM_HUSB,
964 GEDCOM_MAKE_XREF_PTR(val1, xr));
965 START(HUSB, $1, $<ctxt>$)
970 { end_element(ELT_FAM_HUSB, PARENT, $<ctxt>5,
971 GEDCOM_MAKE_NULL(val1));
976 fam_wife_sect : OPEN DELIM TAG_WIFE mand_pointer
977 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
979 if (xr == NULL) HANDLE_ERROR;
980 $<ctxt>$ = start_element(ELT_FAM_WIFE,
982 GEDCOM_MAKE_XREF_PTR(val1, xr));
983 START(WIFE, $1, $<ctxt>$)
988 { end_element(ELT_FAM_WIFE, PARENT, $<ctxt>5,
989 GEDCOM_MAKE_NULL(val1));
994 fam_chil_sect : OPEN DELIM TAG_CHIL mand_pointer
995 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
997 if (xr == NULL) HANDLE_ERROR;
998 $<ctxt>$ = start_element(ELT_FAM_CHIL,
1000 GEDCOM_MAKE_XREF_PTR(val1, xr));
1001 START(CHIL, $1, $<ctxt>$)
1006 { end_element(ELT_FAM_CHIL, PARENT, $<ctxt>5,
1007 GEDCOM_MAKE_NULL(val1));
1012 fam_nchi_sect : OPEN DELIM TAG_NCHI mand_line_item
1013 { $<ctxt>$ = start_element(ELT_FAM_NCHI,
1015 GEDCOM_MAKE_STRING(val1, $4));
1016 START(NCHI, $1, $<ctxt>$)
1021 { end_element(ELT_FAM_NCHI, PARENT, $<ctxt>5,
1022 GEDCOM_MAKE_NULL(val1));
1027 fam_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1028 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1030 if (xr == NULL) HANDLE_ERROR;
1031 $<ctxt>$ = start_element(ELT_FAM_SUBM,
1033 GEDCOM_MAKE_XREF_PTR(val1, xr));
1034 START(SUBM, $1, $<ctxt>$)
1039 { end_element(ELT_FAM_SUBM, PARENT, $<ctxt>5,
1040 GEDCOM_MAKE_NULL(val1));
1044 /*********************************************************************/
1045 /**** Individual record ****/
1046 /*********************************************************************/
1047 indiv_rec : OPEN DELIM POINTER DELIM TAG_INDI
1048 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1050 if (xr == NULL) HANDLE_ERROR;
1051 $<ctxt>$ = start_record(REC_INDI,
1052 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1053 NULL, GEDCOM_MAKE_NULL(val2));
1054 START(INDI, $1, $<ctxt>$) }
1058 { end_record(REC_INDI, $<ctxt>6, GEDCOM_MAKE_NULL(val1));
1059 if (compat_mode(C_NO_SLGC_FAMC))
1060 compat_generate_slgc_famc_fam();
1064 indi_subs : /* empty */
1065 | indi_subs indi_sub
1068 indi_sub : indi_resn_sect { OCCUR2(RESN, 0, 1) }
1069 | pers_name_struc_sub /* 0:M */
1070 | indi_sex_sect { OCCUR2(SEX, 0, 1) }
1071 | indiv_even_struc_sub /* 0:M */
1072 | indiv_attr_struc_sub /* 0:M */
1073 | lds_indiv_ord_sub /* 0:M */
1074 | chi_fam_link_sub /* 0:M */
1075 | spou_fam_link_sub /* 0:M */
1076 | indi_subm_sect /* 0:M */
1077 | assoc_struc_sub /* 0:M */
1078 | indi_alia_sect /* 0:M */
1079 | indi_anci_sect /* 0:M */
1080 | indi_desi_sect /* 0:M */
1081 | source_cit_sub /* 0:M */
1082 | multim_link_sub /* 0:M */
1083 | note_struc_sub /* 0:M */
1084 | indi_rfn_sect { OCCUR2(RFN, 0, 1) }
1085 | indi_afn_sect /* 0:M */
1086 | ident_struc_sub /* 0:1 */
1087 | change_date_sub /* 0:1 */
1088 | indi_addr_sect { if (!compat_mode(C_INDI_ADDR))
1089 INVALID_TAG("ADDR");
1095 indi_resn_sect : OPEN DELIM TAG_RESN mand_line_item
1096 { $<ctxt>$ = start_element(ELT_INDI_RESN,
1098 GEDCOM_MAKE_STRING(val1, $4));
1099 START(RESN, $1, $<ctxt>$)
1104 { end_element(ELT_INDI_RESN, PARENT, $<ctxt>5,
1105 GEDCOM_MAKE_NULL(val1));
1110 indi_sex_sect : OPEN DELIM TAG_SEX mand_line_item
1111 { $<ctxt>$ = start_element(ELT_INDI_SEX,
1113 GEDCOM_MAKE_STRING(val1, $4));
1114 START(SEX, $1, $<ctxt>$)
1119 { end_element(ELT_INDI_SEX, PARENT, $<ctxt>5,
1120 GEDCOM_MAKE_NULL(val1));
1125 indi_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1126 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1128 if (xr == NULL) HANDLE_ERROR;
1129 $<ctxt>$ = start_element(ELT_INDI_SUBM,
1131 GEDCOM_MAKE_XREF_PTR(val1, xr));
1132 START(SUBM, $1, $<ctxt>$)
1137 { end_element(ELT_INDI_SUBM, PARENT, $<ctxt>5,
1138 GEDCOM_MAKE_NULL(val1));
1143 indi_alia_sect : OPEN DELIM TAG_ALIA mand_pointer
1144 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1146 if (xr == NULL) HANDLE_ERROR;
1147 $<ctxt>$ = start_element(ELT_INDI_ALIA,
1149 GEDCOM_MAKE_XREF_PTR(val1, xr));
1150 START(ALIA, $1, $<ctxt>$)
1155 { end_element(ELT_INDI_ALIA, PARENT, $<ctxt>5,
1156 GEDCOM_MAKE_NULL(val1));
1161 indi_anci_sect : OPEN DELIM TAG_ANCI mand_pointer
1162 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1164 if (xr == NULL) HANDLE_ERROR;
1165 $<ctxt>$ = start_element(ELT_INDI_ANCI,
1167 GEDCOM_MAKE_XREF_PTR(val1, xr));
1168 START(ANCI, $1, $<ctxt>$)
1173 { end_element(ELT_INDI_ANCI, PARENT, $<ctxt>5,
1174 GEDCOM_MAKE_NULL(val1));
1179 indi_desi_sect : OPEN DELIM TAG_DESI mand_pointer
1180 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1182 if (xr == NULL) HANDLE_ERROR;
1183 $<ctxt>$ = start_element(ELT_INDI_DESI,
1185 GEDCOM_MAKE_XREF_PTR(val1, xr));
1186 START(DESI, $1, $<ctxt>$)
1191 { end_element(ELT_INDI_DESI, PARENT, $<ctxt>5,
1192 GEDCOM_MAKE_NULL(val1));
1197 indi_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1198 { $<ctxt>$ = start_element(ELT_INDI_RFN,
1200 GEDCOM_MAKE_STRING(val1, $4));
1201 START(RFN, $1, $<ctxt>$)
1206 { end_element(ELT_INDI_RFN, PARENT, $<ctxt>5,
1207 GEDCOM_MAKE_NULL(val1));
1212 indi_afn_sect : OPEN DELIM TAG_AFN mand_line_item
1213 { $<ctxt>$ = start_element(ELT_INDI_AFN,
1215 GEDCOM_MAKE_STRING(val1, $4));
1216 START(AFN, $1, $<ctxt>$)
1221 { end_element(ELT_INDI_AFN, PARENT, $<ctxt>5,
1222 GEDCOM_MAKE_NULL(val1));
1226 /* INDI.ADDR (Only for compatibility) */
1227 indi_addr_sect : OPEN DELIM TAG_ADDR opt_line_item
1228 { if (compat_mode(C_INDI_ADDR)) {
1229 Gedcom_ctxt par = compat_generate_resi_start(PARENT);
1230 START(RESI, $1, par);
1232 = start_element(ELT_SUB_ADDR,
1233 par, $1 + 1, $3, $4,
1234 GEDCOM_MAKE_NULL_OR_STRING(val2, $4));
1235 START(ADDR, $1 + 1, $<ctxt>$);
1237 else { START(ADDR, $1, NULL) }
1242 { if (compat_mode(C_INDI_ADDR)) {
1243 Gedcom_ctxt par = PARENT;
1244 end_element(ELT_SUB_ADDR, par, $<ctxt>5,
1245 GEDCOM_MAKE_NULL(val1));
1247 compat_generate_resi_end(PARENT, par);
1252 ftree_addr_subs : /* empty */
1253 | ftree_addr_subs ftree_addr_sub
1256 ftree_addr_sub : continuation_sub
1257 | ftree_addr_phon_sect
1261 ftree_addr_phon_sect : OPEN DELIM TAG_PHON mand_line_item
1263 = start_element(ELT_SUB_PHON,
1264 GRANDPARENT(1), $1, $3, $4,
1265 GEDCOM_MAKE_STRING(val1, $4));
1266 START(PHON, $1, $<ctxt>$)
1271 { end_element(ELT_SUB_PHON, GRANDPARENT(1),
1272 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1276 /*********************************************************************/
1277 /**** Multimedia record ****/
1278 /*********************************************************************/
1279 multim_rec : OPEN DELIM POINTER DELIM TAG_OBJE
1280 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1282 if (xr == NULL) HANDLE_ERROR;
1283 $<ctxt>$ = start_record(REC_OBJE,
1284 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1285 NULL, GEDCOM_MAKE_NULL(val2));
1286 START(OBJE, $1, $<ctxt>$) }
1288 { CHECK2(FORM, BLOB) }
1290 { end_record(REC_OBJE, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1293 obje_subs : /* empty */
1294 | obje_subs obje_sub
1297 obje_sub : obje_form_sect { OCCUR2(FORM, 1, 1) }
1298 | obje_titl_sect { OCCUR2(TITL, 0, 1) }
1299 | note_struc_sub /* 0:M */
1300 | obje_blob_sect { OCCUR2(BLOB, 1, 1) }
1301 | obje_obje_sect { OCCUR2(OBJE, 0, 1) }
1302 | ident_struc_sub /* 0:1 */
1303 | change_date_sub /* 0:1 */
1308 obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
1309 { $<ctxt>$ = start_element(ELT_OBJE_FORM,
1311 GEDCOM_MAKE_STRING(val1, $4));
1312 START(FORM, $1, $<ctxt>$)
1317 { end_element(ELT_OBJE_FORM, PARENT, $<ctxt>5,
1318 GEDCOM_MAKE_NULL(val1));
1323 obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1324 { $<ctxt>$ = start_element(ELT_OBJE_TITL,
1326 GEDCOM_MAKE_STRING(val1, $4));
1327 START(TITL, $1, $<ctxt>$)
1332 { end_element(ELT_OBJE_TITL, PARENT, $<ctxt>5,
1333 GEDCOM_MAKE_NULL(val1));
1338 obje_blob_sect : OPEN DELIM TAG_BLOB
1339 { $<ctxt>$ = start_element(ELT_OBJE_BLOB,
1340 PARENT, $1, $3, NULL,
1341 GEDCOM_MAKE_NULL(val1));
1342 reset_buffer(&concat_buffer);
1343 START(BLOB, $1, $<ctxt>$)
1348 { char* complete = get_buf_string(&concat_buffer);
1349 end_element(ELT_OBJE_BLOB, PARENT, $<ctxt>4,
1350 GEDCOM_MAKE_STRING(val1, complete));
1354 obje_blob_subs : /* empty */
1355 | obje_blob_subs obje_blob_sub
1358 obje_blob_sub : obje_blob_cont_sect { OCCUR1(CONT, 1) }
1362 obje_blob_cont_sect : OPEN DELIM TAG_CONT mand_line_item
1363 { $<ctxt>$ = start_element(ELT_OBJE_BLOB_CONT,
1365 GEDCOM_MAKE_STRING(val1, $4));
1366 safe_buf_append(&concat_buffer, $4);
1367 START(CONT, $1, $<ctxt>$)
1372 { end_element(ELT_OBJE_BLOB_CONT, PARENT,
1373 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1378 obje_obje_sect : OPEN DELIM TAG_OBJE mand_pointer
1379 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1381 if (xr == NULL) HANDLE_ERROR;
1382 $<ctxt>$ = start_element(ELT_OBJE_OBJE,
1384 GEDCOM_MAKE_XREF_PTR(val1, xr));
1385 START(OBJE, $1, $<ctxt>$)
1390 { end_element(ELT_OBJE_OBJE, PARENT, $<ctxt>5,
1391 GEDCOM_MAKE_NULL(val1));
1395 /*********************************************************************/
1396 /**** Note record ****/
1397 /*********************************************************************/
1398 note_rec : OPEN DELIM POINTER DELIM TAG_NOTE note_line_item
1399 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1401 if (xr == NULL) HANDLE_ERROR;
1402 $<ctxt>$ = start_record(REC_NOTE,
1403 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1404 $6, GEDCOM_MAKE_STRING(val2, $6));
1405 reset_buffer(&concat_buffer);
1406 safe_buf_append(&concat_buffer, $6);
1407 START(NOTE, $1, $<ctxt>$) }
1411 { char* complete = get_buf_string(&concat_buffer);
1412 end_record(REC_NOTE, $<ctxt>7,
1413 GEDCOM_MAKE_STRING(val1, complete)); }
1416 note_line_item : /* empty */
1417 { if (!compat_mode(C_NOTE_NO_VALUE)) {
1418 gedcom_error(_("Missing value")); YYERROR;
1425 { gedcom_debug_print("==Val: %s==", $2);
1429 note_subs : /* empty */
1430 | note_subs note_sub
1433 note_sub : continuation_sub /* 0:M */
1434 | source_cit_sub /* 0:M */
1435 | ident_struc_sub /* 0:1 */
1436 | change_date_sub /* 0:1 */
1440 /*********************************************************************/
1441 /**** Repository record ****/
1442 /*********************************************************************/
1443 repos_rec : OPEN DELIM POINTER DELIM TAG_REPO
1444 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1446 if (xr == NULL) HANDLE_ERROR;
1447 $<ctxt>$ = start_record(REC_REPO,
1448 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1449 NULL, GEDCOM_MAKE_NULL(val2));
1450 START(REPO, $1, $<ctxt>$) }
1454 { end_record(REC_REPO, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1457 repo_subs : /* empty */
1458 | repo_subs repo_sub
1461 repo_sub : repo_name_sect { OCCUR2(NAME, 0, 1) }
1462 | addr_struc_sub /* 0:1 */
1463 | note_struc_sub /* 0:M */
1464 | ident_struc_sub /* 0:1 */
1465 | change_date_sub /* 0:1 */
1470 repo_name_sect : OPEN DELIM TAG_NAME mand_line_item
1471 { $<ctxt>$ = start_element(ELT_REPO_NAME,
1473 GEDCOM_MAKE_STRING(val1, $4));
1474 START(NAME, $1, $<ctxt>$)
1479 { end_element(ELT_REPO_NAME, PARENT, $<ctxt>5,
1480 GEDCOM_MAKE_NULL(val1));
1484 /*********************************************************************/
1485 /**** Source record ****/
1486 /*********************************************************************/
1487 source_rec : OPEN DELIM POINTER DELIM TAG_SOUR
1488 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1490 if (xr == NULL) HANDLE_ERROR;
1491 $<ctxt>$ = start_record(REC_SOUR,
1492 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1493 NULL, GEDCOM_MAKE_NULL(val2));
1494 START(SOUR, $1, $<ctxt>$) }
1498 { end_record(REC_SOUR, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1501 sour_subs : /* empty */
1502 | sour_subs sour_sub
1505 sour_sub : sour_data_sect { OCCUR2(DATA, 0, 1) }
1506 | sour_auth_sect { OCCUR2(AUTH, 0, 1) }
1507 | sour_titl_sect { OCCUR2(TITL, 0, 1) }
1508 | sour_abbr_sect { OCCUR2(ABBR, 0, 1) }
1509 | sour_publ_sect { OCCUR2(PUBL, 0, 1) }
1510 | sour_text_sect { OCCUR2(TEXT, 0, 1) }
1511 | source_repos_cit_sub /* 0:1 */
1512 | multim_link_sub /* 0:M */
1513 | note_struc_sub /* 0:M */
1514 | ident_struc_sub /* 0:1 */
1515 | change_date_sub /* 0:1 */
1520 sour_data_sect : OPEN DELIM TAG_DATA
1521 { $<ctxt>$ = start_element(ELT_SOUR_DATA,
1522 PARENT, $1, $3, NULL,
1523 GEDCOM_MAKE_NULL(val1));
1524 START(DATA, $1, $<ctxt>$)
1529 { end_element(ELT_SOUR_DATA, PARENT, $<ctxt>4,
1530 GEDCOM_MAKE_NULL(val1));
1534 sour_data_subs : /* empty */
1535 | sour_data_subs sour_data_sub
1538 sour_data_sub : sour_data_even_sect /* 0:M */
1539 | sour_data_agnc_sect { OCCUR2(AGNC, 0, 1) }
1540 | note_struc_sub /* 0:M */
1544 sour_data_even_sect : OPEN DELIM TAG_EVEN mand_line_item
1545 { $<ctxt>$ = start_element(ELT_SOUR_DATA_EVEN,
1547 GEDCOM_MAKE_STRING(val1, $4));
1548 START(EVEN, $1, $<ctxt>$)
1553 { end_element(ELT_SOUR_DATA_EVEN, PARENT,
1554 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1558 sour_data_even_subs : /* empty */
1559 | sour_data_even_subs sour_data_even_sub
1562 sour_data_even_sub : sour_data_even_date_sect { OCCUR2(DATE, 0, 1) }
1563 | sour_data_even_plac_sect { OCCUR2(PLAC, 0, 1) }
1567 sour_data_even_date_sect : OPEN DELIM TAG_DATE mand_line_item
1568 { struct date_value dv = gedcom_parse_date($4);
1570 = start_element(ELT_SOUR_DATA_EVEN_DATE,
1572 GEDCOM_MAKE_DATE(val1, dv));
1573 START(DATE, $1, $<ctxt>$)
1578 { end_element(ELT_SOUR_DATA_EVEN_DATE, PARENT,
1579 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1583 sour_data_even_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
1585 = start_element(ELT_SOUR_DATA_EVEN_PLAC,
1587 GEDCOM_MAKE_STRING(val1, $4));
1588 START(PLAC, $1, $<ctxt>$)
1593 { end_element(ELT_SOUR_DATA_EVEN_PLAC, PARENT,
1594 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1598 sour_data_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
1599 { $<ctxt>$ = start_element(ELT_SOUR_DATA_AGNC,
1601 GEDCOM_MAKE_STRING(val1, $4));
1602 START(AGNC, $1, $<ctxt>$)
1607 { end_element(ELT_SOUR_DATA_AGNC, PARENT,
1608 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1613 sour_auth_sect : OPEN DELIM TAG_AUTH mand_line_item
1614 { $<ctxt>$ = start_element(ELT_SOUR_AUTH,
1616 GEDCOM_MAKE_STRING(val1, $4));
1617 reset_buffer(&concat_buffer);
1618 safe_buf_append(&concat_buffer, $4);
1619 START(AUTH, $1, $<ctxt>$)
1624 { char* complete = get_buf_string(&concat_buffer);
1625 end_element(ELT_SOUR_AUTH, PARENT, $<ctxt>5,
1626 GEDCOM_MAKE_STRING(val1, complete));
1630 sour_auth_subs : /* empty */
1631 | sour_auth_subs sour_auth_sub
1634 sour_auth_sub : continuation_sub /* 0:M */
1639 sour_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1640 { $<ctxt>$ = start_element(ELT_SOUR_TITL,
1642 GEDCOM_MAKE_STRING(val1, $4));
1643 reset_buffer(&concat_buffer);
1644 safe_buf_append(&concat_buffer, $4);
1645 START(TITL, $1, $<ctxt>$)
1650 { char* complete = get_buf_string(&concat_buffer);
1651 end_element(ELT_SOUR_TITL, PARENT, $<ctxt>5,
1652 GEDCOM_MAKE_STRING(val1, complete));
1656 sour_titl_subs : /* empty */
1657 | sour_titl_subs sour_titl_sub
1660 sour_titl_sub : continuation_sub /* 0:M */
1665 sour_abbr_sect : OPEN DELIM TAG_ABBR mand_line_item
1666 { $<ctxt>$ = start_element(ELT_SOUR_ABBR,
1668 GEDCOM_MAKE_STRING(val1, $4));
1669 START(ABBR, $1, $<ctxt>$)
1674 { end_element(ELT_SOUR_ABBR, PARENT, $<ctxt>5,
1675 GEDCOM_MAKE_NULL(val1));
1680 sour_publ_sect : OPEN DELIM TAG_PUBL mand_line_item
1681 { $<ctxt>$ = start_element(ELT_SOUR_PUBL,
1683 GEDCOM_MAKE_STRING(val1, $4));
1684 reset_buffer(&concat_buffer);
1685 safe_buf_append(&concat_buffer, $4);
1686 START(PUBL, $1, $<ctxt>$)
1691 { char* complete = get_buf_string(&concat_buffer);
1692 end_element(ELT_SOUR_PUBL, PARENT, $<ctxt>5,
1693 GEDCOM_MAKE_STRING(val1, complete));
1697 sour_publ_subs : /* empty */
1698 | sour_publ_subs sour_publ_sub
1701 sour_publ_sub : continuation_sub /* 0:M */
1706 sour_text_sect : OPEN DELIM TAG_TEXT mand_line_item
1707 { $<ctxt>$ = start_element(ELT_SOUR_TEXT,
1709 GEDCOM_MAKE_STRING(val1, $4));
1710 reset_buffer(&concat_buffer);
1711 safe_buf_append(&concat_buffer, $4);
1712 START(TEXT, $1, $<ctxt>$)
1717 { char* complete = get_buf_string(&concat_buffer);
1718 end_element(ELT_SOUR_TEXT, PARENT, $<ctxt>5,
1719 GEDCOM_MAKE_STRING(val1, complete));
1723 sour_text_subs : /* empty */
1724 | sour_text_subs sour_text_sub
1727 sour_text_sub : continuation_sub /* 0:M */
1731 /*********************************************************************/
1732 /**** Submission record ****/
1733 /*********************************************************************/
1734 submis_rec : OPEN DELIM POINTER DELIM TAG_SUBN
1735 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1737 if (xr == NULL) HANDLE_ERROR;
1738 $<ctxt>$ = start_record(REC_SUBN,
1739 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1740 NULL, GEDCOM_MAKE_NULL(val2));
1741 START(SUBN, $1, $<ctxt>$) }
1745 { end_record(REC_SUBN, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1748 subn_subs : /* empty */
1749 | subn_subs subn_sub
1752 subn_sub : subn_subm_sect { OCCUR2(SUBM, 0, 1) }
1753 | subn_famf_sect { OCCUR2(FAMF, 0, 1) }
1754 | subn_temp_sect { OCCUR2(TEMP, 0, 1) }
1755 | subn_ance_sect { OCCUR2(ANCE, 0, 1) }
1756 | subn_desc_sect { OCCUR2(DESC, 0, 1) }
1757 | subn_ordi_sect { OCCUR2(ORDI, 0, 1) }
1758 | subn_rin_sect { OCCUR2(RIN, 0, 1) }
1763 subn_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1764 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1766 if (xr == NULL) HANDLE_ERROR;
1767 $<ctxt>$ = start_element(ELT_SUBN_SUBM,
1769 GEDCOM_MAKE_XREF_PTR(val1, xr));
1770 START(SUBM, $1, $<ctxt>$)
1775 { end_element(ELT_SUBN_SUBM, PARENT, $<ctxt>5,
1776 GEDCOM_MAKE_NULL(val1));
1781 subn_famf_sect : OPEN DELIM TAG_FAMF mand_line_item
1782 { $<ctxt>$ = start_element(ELT_SUBN_FAMF,
1784 GEDCOM_MAKE_STRING(val1, $4));
1785 START(FAMF, $1, $<ctxt>$)
1790 { end_element(ELT_SUBN_FAMF, PARENT, $<ctxt>5,
1791 GEDCOM_MAKE_NULL(val1));
1796 subn_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
1797 { $<ctxt>$ = start_element(ELT_SUBN_TEMP,
1799 GEDCOM_MAKE_STRING(val1, $4));
1800 START(TEMP, $1, $<ctxt>$)
1805 { end_element(ELT_SUBN_TEMP, PARENT, $<ctxt>5,
1806 GEDCOM_MAKE_NULL(val1));
1811 subn_ance_sect : OPEN DELIM TAG_ANCE mand_line_item
1812 { $<ctxt>$ = start_element(ELT_SUBN_ANCE,
1814 GEDCOM_MAKE_STRING(val1, $4));
1815 START(ANCE, $1, $<ctxt>$)
1820 { end_element(ELT_SUBN_ANCE, PARENT, $<ctxt>5,
1821 GEDCOM_MAKE_NULL(val1));
1826 subn_desc_sect : OPEN DELIM TAG_DESC mand_line_item
1827 { $<ctxt>$ = start_element(ELT_SUBN_DESC,
1829 GEDCOM_MAKE_STRING(val1, $4));
1830 START(DESC, $1, $<ctxt>$)
1835 { end_element(ELT_SUBN_DESC, PARENT, $<ctxt>5,
1836 GEDCOM_MAKE_NULL(val1));
1841 subn_ordi_sect : OPEN DELIM TAG_ORDI mand_line_item
1842 { $<ctxt>$ = start_element(ELT_SUBN_ORDI,
1844 GEDCOM_MAKE_STRING(val1, $4));
1845 START(ORDI, $1, $<ctxt>$)
1850 { end_element(ELT_SUBN_ORDI, PARENT, $<ctxt>5,
1851 GEDCOM_MAKE_NULL(val1));
1856 subn_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1857 { $<ctxt>$ = start_element(ELT_SUBN_RIN,
1859 GEDCOM_MAKE_STRING(val1, $4));
1860 START(RIN, $1, $<ctxt>$)
1865 { end_element(ELT_SUBN_RIN, PARENT, $<ctxt>5,
1866 GEDCOM_MAKE_NULL(val1));
1870 /*********************************************************************/
1871 /**** Submitter record ****/
1872 /*********************************************************************/
1873 submit_rec : OPEN DELIM POINTER DELIM TAG_SUBM
1874 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1876 if (xr == NULL) HANDLE_ERROR;
1877 $<ctxt>$ = start_record(REC_SUBM,
1878 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1879 NULL, GEDCOM_MAKE_NULL(val2));
1880 START(SUBM, $1, $<ctxt>$) }
1884 { end_record(REC_SUBM, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1887 subm_subs : /* empty */
1888 | subm_subs subm_sub
1891 subm_sub : subm_name_sect { OCCUR2(NAME, 1, 1) }
1892 | addr_struc_sub /* 0:1 */
1893 | multim_link_sub /* 0:M */
1894 | subm_lang_sect { OCCUR2(LANG, 0, 3) }
1895 | subm_rfn_sect { OCCUR2(RFN, 0, 1) }
1896 | subm_rin_sect { OCCUR2(RIN, 0, 1) }
1897 | change_date_sub /* 0:1 */
1902 subm_name_sect : OPEN DELIM TAG_NAME mand_line_item
1903 { $<ctxt>$ = start_element(ELT_SUBM_NAME,
1905 GEDCOM_MAKE_STRING(val1, $4));
1906 START(NAME, $1, $<ctxt>$)
1911 { end_element(ELT_SUBM_NAME, PARENT, $<ctxt>5,
1912 GEDCOM_MAKE_NULL(val1));
1917 subm_lang_sect : OPEN DELIM TAG_LANG mand_line_item
1918 { $<ctxt>$ = start_element(ELT_SUBM_LANG,
1920 GEDCOM_MAKE_STRING(val1, $4));
1921 START(LANG, $1, $<ctxt>$)
1926 { end_element(ELT_SUBM_LANG, PARENT, $<ctxt>5,
1927 GEDCOM_MAKE_NULL(val1));
1932 subm_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1933 { $<ctxt>$ = start_element(ELT_SUBM_RFN,
1935 GEDCOM_MAKE_STRING(val1, $4));
1936 START(RFN, $1, $<ctxt>$)
1941 { end_element(ELT_SUBM_RFN, PARENT, $<ctxt>5,
1942 GEDCOM_MAKE_NULL(val1));
1947 subm_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1948 { $<ctxt>$ = start_element(ELT_SUBM_RIN,
1950 GEDCOM_MAKE_STRING(val1, $4));
1951 START(RIN, $1, $<ctxt>$)
1956 { end_element(ELT_SUBM_RIN, PARENT, $<ctxt>5,
1957 GEDCOM_MAKE_NULL(val1));
1961 /*********************************************************************/
1962 /**** Substructures ****/
1963 /*********************************************************************/
1965 /* ADDRESS STRUCTURE */
1966 addr_struc_sub : addr_sect { OCCUR2(ADDR, 0, 1) }
1967 | phon_sect { OCCUR2(PHON, 0, 3) }
1970 addr_sect : OPEN DELIM TAG_ADDR mand_line_item
1971 { $<ctxt>$ = start_element(ELT_SUB_ADDR,
1973 GEDCOM_MAKE_STRING(val1, $4));
1974 reset_buffer(&concat_buffer);
1975 safe_buf_append(&concat_buffer, $4);
1976 START(ADDR, $1, $<ctxt>$)
1981 { char* complete = get_buf_string(&concat_buffer);
1982 end_element(ELT_SUB_ADDR, PARENT, $<ctxt>5,
1983 GEDCOM_MAKE_STRING(val1, complete));
1987 addr_subs : /* empty */
1988 | addr_subs addr_sub
1991 addr_sub : addr_cont_sect /* 0:M */
1992 | addr_adr1_sect { OCCUR2(ADR1, 0, 1) }
1993 | addr_adr2_sect { OCCUR2(ADR2, 0, 1) }
1994 | addr_city_sect { OCCUR2(CITY, 0, 1) }
1995 | addr_stae_sect { OCCUR2(STAE, 0, 1) }
1996 | addr_post_sect { OCCUR2(POST, 0, 1) }
1997 | addr_ctry_sect { OCCUR2(CTRY, 0, 1) }
2001 addr_cont_sect : OPEN DELIM TAG_CONT mand_line_item
2002 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CONT,
2004 GEDCOM_MAKE_STRING(val1, $4));
2005 SAFE_BUF_ADDCHAR(&concat_buffer, '\n');
2006 safe_buf_append(&concat_buffer, $4);
2007 START(CONT, $1, $<ctxt>$)
2012 { end_element(ELT_SUB_ADDR_CONT, PARENT, $<ctxt>5,
2013 GEDCOM_MAKE_NULL(val1));
2016 addr_adr1_sect : OPEN DELIM TAG_ADR1 mand_line_item
2017 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR1,
2019 GEDCOM_MAKE_STRING(val1, $4));
2020 START(ADR1, $1, $<ctxt>$)
2025 { end_element(ELT_SUB_ADDR_ADR1, PARENT, $<ctxt>5,
2026 GEDCOM_MAKE_NULL(val1));
2029 addr_adr2_sect : OPEN DELIM TAG_ADR2 mand_line_item
2030 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR2,
2032 GEDCOM_MAKE_STRING(val1, $4));
2033 START(ADR2, $1, $<ctxt>$)
2038 { end_element(ELT_SUB_ADDR_ADR2, PARENT, $<ctxt>5,
2039 GEDCOM_MAKE_NULL(val1));
2042 addr_city_sect : OPEN DELIM TAG_CITY mand_line_item
2043 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CITY,
2045 GEDCOM_MAKE_STRING(val1, $4));
2046 START(CITY, $1, $<ctxt>$)
2051 { end_element(ELT_SUB_ADDR_CITY, PARENT, $<ctxt>5,
2052 GEDCOM_MAKE_NULL(val1));
2055 addr_stae_sect : OPEN DELIM TAG_STAE mand_line_item
2056 { $<ctxt>$ = start_element(ELT_SUB_ADDR_STAE,
2058 GEDCOM_MAKE_STRING(val1, $4));
2059 START(STAE, $1, $<ctxt>$)
2064 { end_element(ELT_SUB_ADDR_STAE, PARENT, $<ctxt>5,
2065 GEDCOM_MAKE_NULL(val1));
2068 addr_post_sect : OPEN DELIM TAG_POST mand_line_item
2069 { $<ctxt>$ = start_element(ELT_SUB_ADDR_POST,
2071 GEDCOM_MAKE_STRING(val1, $4));
2072 START(POST, $1, $<ctxt>$)
2077 { end_element(ELT_SUB_ADDR_POST, PARENT, $<ctxt>5,
2078 GEDCOM_MAKE_NULL(val1));
2081 addr_ctry_sect : OPEN DELIM TAG_CTRY mand_line_item
2082 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CTRY,
2084 GEDCOM_MAKE_STRING(val1, $4));
2085 START(CTRY, $1, $<ctxt>$)
2090 { end_element(ELT_SUB_ADDR_CTRY, PARENT, $<ctxt>5,
2091 GEDCOM_MAKE_NULL(val1));
2095 phon_sect : OPEN DELIM TAG_PHON mand_line_item
2096 { $<ctxt>$ = start_element(ELT_SUB_PHON,
2098 GEDCOM_MAKE_STRING(val1, $4));
2099 START(PHON, $1, $<ctxt>$)
2104 { end_element(ELT_SUB_PHON, PARENT, $<ctxt>5,
2105 GEDCOM_MAKE_NULL(val1));
2109 /* ASSOCIATION STRUCTURE */
2110 assoc_struc_sub : asso_sect /* 0:M */
2113 asso_sect : OPEN DELIM TAG_ASSO mand_pointer
2114 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2116 if (xr == NULL) HANDLE_ERROR;
2117 $<ctxt>$ = start_element(ELT_SUB_ASSO,
2119 GEDCOM_MAKE_XREF_PTR(val1, xr));
2120 START(ASSO, $1, $<ctxt>$)
2123 { CHECK2(TYPE,RELA) }
2125 { end_element(ELT_SUB_ASSO, PARENT, $<ctxt>5,
2126 GEDCOM_MAKE_NULL(val1));
2130 asso_subs : /* empty */
2131 | asso_type_sect { OCCUR2(TYPE, 1, 1) }
2132 | asso_rela_sect { OCCUR2(RELA, 1, 1) }
2138 asso_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2139 { $<ctxt>$ = start_element(ELT_SUB_ASSO_TYPE,
2141 GEDCOM_MAKE_STRING(val1, $4));
2142 START(TYPE, $1, $<ctxt>$)
2147 { end_element(ELT_SUB_ASSO_TYPE, PARENT, $<ctxt>5,
2148 GEDCOM_MAKE_NULL(val1));
2152 asso_rela_sect : OPEN DELIM TAG_RELA mand_line_item
2153 { $<ctxt>$ = start_element(ELT_SUB_ASSO_RELA,
2155 GEDCOM_MAKE_STRING(val1, $4));
2156 START(RELA, $1, $<ctxt>$)
2161 { end_element(ELT_SUB_ASSO_RELA, PARENT, $<ctxt>5,
2162 GEDCOM_MAKE_NULL(val1));
2167 change_date_sub : change_date_chan_sect { OCCUR2(CHAN, 0, 1) }
2170 change_date_chan_sect : OPEN DELIM TAG_CHAN
2171 { $<ctxt>$ = start_element(ELT_SUB_CHAN,
2172 PARENT, $1, $3, NULL,
2173 GEDCOM_MAKE_NULL(val1));
2174 START(CHAN, $1, $<ctxt>$)
2176 change_date_chan_subs
2179 { end_element(ELT_SUB_CHAN, PARENT, $<ctxt>4,
2180 GEDCOM_MAKE_NULL(val1));
2184 change_date_chan_subs : /* empty */
2185 | change_date_chan_subs change_date_chan_sub
2188 change_date_chan_sub : change_date_date_sect { OCCUR2(DATE, 1, 1) }
2193 change_date_date_sect : OPEN DELIM TAG_DATE mand_line_item
2194 { struct date_value dv = gedcom_parse_date($4);
2195 $<ctxt>$ = start_element(ELT_SUB_CHAN_DATE,
2197 GEDCOM_MAKE_DATE(val1, dv));
2198 START(DATE, $1, $<ctxt>$) }
2199 change_date_date_subs
2202 { end_element(ELT_SUB_CHAN_DATE, PARENT, $<ctxt>5,
2203 GEDCOM_MAKE_NULL(val1));
2207 change_date_date_subs : /* empty */
2208 | change_date_date_subs change_date_date_sub
2211 change_date_date_sub : change_date_date_time_sect { OCCUR2(TIME, 0, 1) }
2215 change_date_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
2217 = start_element(ELT_SUB_CHAN_TIME,
2219 GEDCOM_MAKE_STRING(val1, $4));
2220 START(TIME, $1, $<ctxt>$)
2225 { end_element(ELT_SUB_CHAN_TIME, PARENT, $<ctxt>5,
2226 GEDCOM_MAKE_NULL(val1));
2230 /* CHILD TO FAMILY LINK */
2231 chi_fam_link_sub : famc_sect /* 0:M */
2234 famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2235 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2237 if (xr == NULL) HANDLE_ERROR;
2238 $<ctxt>$ = start_element(ELT_SUB_FAMC,
2240 GEDCOM_MAKE_XREF_PTR(val1, xr));
2241 START(FAMC, $1, $<ctxt>$)
2246 { end_element(ELT_SUB_FAMC, PARENT, $<ctxt>5,
2247 GEDCOM_MAKE_NULL(val1));
2251 famc_subs : /* empty */
2252 | famc_subs famc_sub
2255 famc_sub : famc_pedi_sect /* 0:M */
2260 famc_pedi_sect : OPEN DELIM TAG_PEDI mand_line_item
2261 { $<ctxt>$ = start_element(ELT_SUB_FAMC_PEDI,
2263 GEDCOM_MAKE_STRING(val1, $4));
2264 START(PEDI, $1, $<ctxt>$)
2269 { end_element(ELT_SUB_FAMC_PEDI, PARENT, $<ctxt>5,
2270 GEDCOM_MAKE_NULL(val1));
2274 /* CONTINUATION SUBSECTIONS */
2275 continuation_sub : cont_sect /* 0:M */
2276 | conc_sect /* 0:M */
2279 cont_sect : OPEN DELIM TAG_CONT mand_line_item
2280 { $<ctxt>$ = start_element(ELT_SUB_CONT,
2282 GEDCOM_MAKE_STRING(val1, $4));
2283 SAFE_BUF_ADDCHAR(&concat_buffer, '\n');
2284 safe_buf_append(&concat_buffer, $4);
2285 START(CONT, $1, $<ctxt>$)
2290 { end_element(ELT_SUB_CONT, PARENT, $<ctxt>5,
2291 GEDCOM_MAKE_NULL(val1));
2295 conc_sect : OPEN DELIM TAG_CONC mand_line_item
2296 { $<ctxt>$ = start_element(ELT_SUB_CONC,
2298 GEDCOM_MAKE_STRING(val1, $4));
2299 safe_buf_append(&concat_buffer, $4);
2300 START(CONC, $1, $<ctxt>$)
2305 { end_element(ELT_SUB_CONC, PARENT, $<ctxt>5,
2306 GEDCOM_MAKE_NULL(val1));
2311 event_detail_sub : event_detail_type_sect { OCCUR2(TYPE, 0, 1) }
2312 | event_detail_date_sect { OCCUR2(DATE, 0, 1) }
2315 | event_detail_age_sect { OCCUR2(AGE, 0, 1) }
2316 | event_detail_agnc_sect { OCCUR2(AGNC, 0, 1) }
2317 | event_detail_caus_sect { OCCUR2(CAUS, 0, 1) }
2323 event_detail_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2325 = start_element(ELT_SUB_EVT_TYPE,
2327 GEDCOM_MAKE_STRING(val1, $4));
2328 START(TYPE, $1, $<ctxt>$)
2333 { end_element(ELT_SUB_EVT_TYPE, PARENT, $<ctxt>5,
2334 GEDCOM_MAKE_NULL(val1));
2337 event_detail_date_sect : OPEN DELIM TAG_DATE mand_line_item
2338 { struct date_value dv = gedcom_parse_date($4);
2340 = start_element(ELT_SUB_EVT_DATE,
2342 GEDCOM_MAKE_DATE(val1, dv));
2343 START(DATE, $1, $<ctxt>$)
2348 { end_element(ELT_SUB_EVT_DATE, PARENT, $<ctxt>5,
2349 GEDCOM_MAKE_NULL(val1));
2352 event_detail_age_sect : OPEN DELIM TAG_AGE mand_line_item
2353 { struct age_value age = gedcom_parse_age($4);
2355 = start_element(ELT_SUB_EVT_AGE,
2357 GEDCOM_MAKE_AGE(val1, age));
2358 START(AGE, $1, $<ctxt>$)
2363 { end_element(ELT_SUB_EVT_AGE, PARENT, $<ctxt>5,
2364 GEDCOM_MAKE_NULL(val1));
2367 event_detail_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
2369 = start_element(ELT_SUB_EVT_AGNC,
2371 GEDCOM_MAKE_STRING(val1, $4));
2372 START(AGNC, $1, $<ctxt>$)
2377 { end_element(ELT_SUB_EVT_AGNC, PARENT, $<ctxt>5,
2378 GEDCOM_MAKE_NULL(val1));
2381 event_detail_caus_sect : OPEN DELIM TAG_CAUS mand_line_item
2383 = start_element(ELT_SUB_EVT_CAUS,
2385 GEDCOM_MAKE_STRING(val1, $4));
2386 START(CAUS, $1, $<ctxt>$)
2391 { end_element(ELT_SUB_EVT_CAUS, PARENT, $<ctxt>5,
2392 GEDCOM_MAKE_NULL(val1));
2396 /* FAMILY EVENT STRUCTURE */
2397 fam_event_struc_sub : fam_event_sect
2398 | fam_gen_even_sect /* 0:M */
2401 fam_event_sect : OPEN DELIM fam_event_tag opt_value
2403 = start_element(ELT_SUB_FAM_EVT,
2405 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2406 START2($1, $<ctxt>$);
2411 { end_element(ELT_SUB_FAM_EVT, PARENT, $<ctxt>5,
2412 GEDCOM_MAKE_NULL(val1));
2416 fam_event_tag : TAG_ANUL { $$ = $1; START1(ANUL) }
2417 | TAG_CENS { $$ = $1; START1(CENS) }
2418 | TAG_DIV { $$ = $1; START1(DIV) }
2419 | TAG_DIVF { $$ = $1; START1(DIVF) }
2420 | TAG_ENGA { $$ = $1; START1(ENGA) }
2421 | TAG_MARR { $$ = $1; START1(MARR) }
2422 | TAG_MARB { $$ = $1; START1(MARB) }
2423 | TAG_MARC { $$ = $1; START1(MARC) }
2424 | TAG_MARL { $$ = $1; START1(MARL) }
2425 | TAG_MARS { $$ = $1; START1(MARS) }
2428 fam_event_subs : /* empty */
2429 | fam_event_subs fam_event_sub
2432 fam_event_sub : event_detail_sub
2433 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2434 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2438 fam_even_husb_sect : OPEN DELIM TAG_HUSB
2439 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_HUSB,
2440 PARENT, $1, $3, NULL,
2441 GEDCOM_MAKE_NULL(val1));
2442 START(HUSB, $1, $<ctxt>$)
2447 { end_element(ELT_SUB_FAM_EVT_HUSB, PARENT, $<ctxt>4,
2448 GEDCOM_MAKE_NULL(val1));
2452 fam_even_husb_subs : /* empty */
2453 | fam_even_husb_subs fam_even_husb_sub
2456 fam_even_husb_sub : fam_even_age_sect { OCCUR2(AGE, 1, 1) }
2460 fam_even_age_sect : OPEN DELIM TAG_AGE mand_line_item
2461 { struct age_value age = gedcom_parse_age($4);
2462 $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_AGE,
2464 GEDCOM_MAKE_AGE(val1, age));
2465 START(AGE, $1, $<ctxt>$)
2470 { end_element(ELT_SUB_FAM_EVT_AGE, PARENT, $<ctxt>5,
2471 GEDCOM_MAKE_NULL(val1));
2475 fam_even_wife_sect : OPEN DELIM TAG_WIFE
2476 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_WIFE,
2477 PARENT, $1, $3, NULL,
2478 GEDCOM_MAKE_NULL(val1));
2479 START(WIFE, $1, $<ctxt>$)
2484 { end_element(ELT_SUB_FAM_EVT_WIFE, PARENT, $<ctxt>4,
2485 GEDCOM_MAKE_NULL(val1));
2489 fam_gen_even_sect : OPEN DELIM TAG_EVEN
2490 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_EVEN,
2491 PARENT, $1, $3, NULL,
2492 GEDCOM_MAKE_NULL(val1));
2493 START(EVEN, $1, $<ctxt>$)
2498 { end_element(ELT_SUB_FAM_EVT_EVEN, PARENT, $<ctxt>4,
2499 GEDCOM_MAKE_NULL(val1));
2503 fam_gen_even_subs : /* empty */
2504 | fam_gen_even_subs fam_gen_even_sub
2507 fam_gen_even_sub : event_detail_sub
2508 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2509 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2513 /* IDENTIFICATION STRUCTURE */
2514 ident_struc_sub : ident_refn_sect /* 0:M */
2515 | ident_rin_sect { OCCUR2(RIN, 0, 1) }
2518 ident_refn_sect : OPEN DELIM TAG_REFN mand_line_item
2519 { $<ctxt>$ = start_element(ELT_SUB_IDENT_REFN,
2521 GEDCOM_MAKE_STRING(val1, $4));
2522 START(REFN, $1, $<ctxt>$)
2527 { end_element(ELT_SUB_IDENT_REFN, PARENT, $<ctxt>5,
2528 GEDCOM_MAKE_NULL(val1));
2532 ident_refn_subs : /* empty */
2533 | ident_refn_subs ident_refn_sub
2536 ident_refn_sub : ident_refn_type_sect { OCCUR2(TYPE, 0, 1) }
2540 ident_refn_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2542 = start_element(ELT_SUB_IDENT_REFN_TYPE,
2544 GEDCOM_MAKE_STRING(val1, $4));
2545 START(TYPE, $1, $<ctxt>$)
2550 { end_element(ELT_SUB_IDENT_REFN_TYPE, PARENT, $<ctxt>5,
2551 GEDCOM_MAKE_NULL(val1));
2555 ident_rin_sect : OPEN DELIM TAG_RIN mand_line_item
2556 { $<ctxt>$ = start_element(ELT_SUB_IDENT_RIN,
2558 GEDCOM_MAKE_STRING(val1, $4));
2559 START(RIN, $1, $<ctxt>$)
2564 { end_element(ELT_SUB_IDENT_RIN, PARENT, $<ctxt>5,
2565 GEDCOM_MAKE_NULL(val1));
2569 /* INDIVIDUAL ATTRIBUTE STRUCTURE */
2570 indiv_attr_struc_sub : indiv_attr_sect /* 0:M */
2571 | indiv_resi_sect /* 0:M */
2574 indiv_attr_sect : OPEN DELIM indiv_attr_tag mand_line_item
2575 { $<ctxt>$ = start_element(ELT_SUB_INDIV_ATTR,
2577 GEDCOM_MAKE_STRING(val1, $4));
2578 START2($1, $<ctxt>$);
2580 indiv_attr_event_subs
2583 { end_element(ELT_SUB_INDIV_ATTR, PARENT, $<ctxt>5,
2584 GEDCOM_MAKE_NULL(val1));
2588 indiv_attr_tag : TAG_CAST { $$ = $1; START1(CAST) }
2589 | TAG_DSCR { $$ = $1; START1(DSCR) }
2590 | TAG_EDUC { $$ = $1; START1(EDUC) }
2591 | TAG_IDNO { $$ = $1; START1(IDNO) }
2592 | TAG_NATI { $$ = $1; START1(NATI) }
2593 | TAG_NCHI { $$ = $1; START1(NCHI) }
2594 | TAG_NMR { $$ = $1; START1(NMR) }
2595 | TAG_OCCU { $$ = $1; START1(OCCU) }
2596 | TAG_PROP { $$ = $1; START1(PROP) }
2597 | TAG_RELI { $$ = $1; START1(RELI) }
2598 | TAG_SSN { $$ = $1; START1(SSN) }
2599 | TAG_TITL { $$ = $1; START1(TITL) }
2602 indiv_resi_sect : OPEN DELIM TAG_RESI
2603 { $<ctxt>$ = start_element(ELT_SUB_INDIV_RESI,
2604 PARENT, $1, $3, NULL,
2605 GEDCOM_MAKE_NULL(val1));
2606 START(RESI, $1, $<ctxt>$)
2608 indiv_attr_event_subs
2611 { end_element(ELT_SUB_INDIV_RESI, PARENT, $<ctxt>4,
2612 GEDCOM_MAKE_NULL(val1));
2616 indiv_attr_event_subs : /* empty */
2617 | indiv_attr_event_subs indiv_attr_event_sub
2620 indiv_attr_event_sub : event_detail_sub
2624 /* INDIVIDUAL EVENT STRUCTURE */
2625 indiv_even_struc_sub : indiv_birt_sect
2627 | indiv_adop_sect /* 0:M */
2628 | indiv_even_sect /* 0:M */
2631 indiv_birt_sect : OPEN DELIM indiv_birt_tag opt_value
2633 = start_element(ELT_SUB_INDIV_BIRT,
2635 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2636 START2($1, $<ctxt>$);
2641 { end_element(ELT_SUB_INDIV_BIRT, PARENT, $<ctxt>5,
2642 GEDCOM_MAKE_NULL(val1));
2646 indiv_birt_tag : TAG_BIRT { $$ = $1; START1(BIRT) }
2647 | TAG_CHR { $$ = $1; START1(CHR) }
2650 indiv_birt_subs : /* empty */
2651 | indiv_birt_subs indiv_birt_sub
2654 indiv_birt_sub : event_detail_sub
2655 | indiv_birt_famc_sect { OCCUR2(FAMC,0, 1) }
2659 indiv_birt_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2660 { struct xref_value *xr = gedcom_parse_xref($4,
2663 if (xr == NULL) HANDLE_ERROR;
2665 = start_element(ELT_SUB_INDIV_BIRT_FAMC,
2667 GEDCOM_MAKE_XREF_PTR(val1, xr));
2668 START(FAMC, $1, $<ctxt>$)
2673 { end_element(ELT_SUB_INDIV_BIRT_FAMC, PARENT, $<ctxt>5,
2674 GEDCOM_MAKE_NULL(val1));
2678 indiv_gen_sect : OPEN DELIM indiv_gen_tag opt_value
2680 = start_element(ELT_SUB_INDIV_GEN,
2682 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2683 START2($1, $<ctxt>$);
2688 { end_element(ELT_SUB_INDIV_GEN, PARENT, $<ctxt>5,
2689 GEDCOM_MAKE_NULL(val1));
2693 indiv_gen_tag : TAG_DEAT { $$ = $1; START1(DEAT) }
2694 | TAG_BURI { $$ = $1; START1(BURI) }
2695 | TAG_CREM { $$ = $1; START1(CREM) }
2696 | TAG_BAPM { $$ = $1; START1(BAPM) }
2697 | TAG_BARM { $$ = $1; START1(BARM) }
2698 | TAG_BASM { $$ = $1; START1(BASM) }
2699 | TAG_BLES { $$ = $1; START1(BLES) }
2700 | TAG_CHRA { $$ = $1; START1(CHRA) }
2701 | TAG_CONF { $$ = $1; START1(CONF) }
2702 | TAG_FCOM { $$ = $1; START1(FCOM) }
2703 | TAG_ORDN { $$ = $1; START1(ORDN) }
2704 | TAG_NATU { $$ = $1; START1(NATU) }
2705 | TAG_EMIG { $$ = $1; START1(EMIG) }
2706 | TAG_IMMI { $$ = $1; START1(IMMI) }
2707 | TAG_CENS { $$ = $1; START1(CENS) }
2708 | TAG_PROB { $$ = $1; START1(PROB) }
2709 | TAG_WILL { $$ = $1; START1(WILL) }
2710 | TAG_GRAD { $$ = $1; START1(GRAD) }
2711 | TAG_RETI { $$ = $1; START1(RETI) }
2714 indiv_gen_subs : /* empty */
2715 | indiv_gen_subs indiv_gen_sub
2718 indiv_gen_sub : event_detail_sub
2722 indiv_adop_sect : OPEN DELIM TAG_ADOP opt_value
2724 = start_element(ELT_SUB_INDIV_ADOP,
2726 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2727 START(ADOP, $1, $<ctxt>$) }
2731 { end_element(ELT_SUB_INDIV_ADOP, PARENT, $<ctxt>5,
2732 GEDCOM_MAKE_NULL(val1));
2736 indiv_adop_subs : /* empty */
2737 | indiv_adop_subs indiv_adop_sub
2740 indiv_adop_sub : event_detail_sub
2741 | indiv_adop_famc_sect { OCCUR2(FAMC,0, 1) }
2745 indiv_adop_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2746 { struct xref_value *xr = gedcom_parse_xref($4,
2749 if (xr == NULL) HANDLE_ERROR;
2751 = start_element(ELT_SUB_INDIV_ADOP_FAMC,
2753 GEDCOM_MAKE_XREF_PTR(val1, xr));
2754 START(FAMC, $1, $<ctxt>$) }
2755 indiv_adop_famc_subs
2758 { end_element(ELT_SUB_INDIV_ADOP_FAMC, PARENT, $<ctxt>5,
2759 GEDCOM_MAKE_NULL(val1));
2763 indiv_adop_famc_subs : /* empty */
2764 | indiv_adop_famc_subs indiv_adop_famc_sub
2767 indiv_adop_famc_sub : indiv_adop_famc_adop_sect { OCCUR2(ADOP,0, 1) }
2771 indiv_adop_famc_adop_sect : OPEN DELIM TAG_ADOP mand_line_item
2773 = start_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2775 GEDCOM_MAKE_STRING(val1, $4));
2776 START(ADOP, $1, $<ctxt>$) }
2780 { end_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2782 GEDCOM_MAKE_NULL(val1));
2786 indiv_even_sect : OPEN DELIM TAG_EVEN
2787 { $<ctxt>$ = start_element(ELT_SUB_INDIV_EVEN,
2788 PARENT, $1, $3, NULL,
2789 GEDCOM_MAKE_NULL(val1));
2790 START(EVEN, $1, $<ctxt>$) }
2794 { end_element(ELT_SUB_INDIV_EVEN, PARENT, $<ctxt>4,
2795 GEDCOM_MAKE_NULL(val1));
2799 /* LDS INDIVIDUAL ORDINANCE */
2800 lds_indiv_ord_sub : lio_bapl_sect /* 0:M */
2801 | lio_slgc_sect /* 0:M */
2804 lio_bapl_sect : OPEN DELIM lio_bapl_tag
2805 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL,
2806 PARENT, $1, $3, NULL,
2807 GEDCOM_MAKE_NULL(val1));
2808 START2($1, $<ctxt>$);
2813 { end_element(ELT_SUB_LIO_BAPL, PARENT, $<ctxt>4,
2814 GEDCOM_MAKE_NULL(val1));
2818 lio_bapl_tag : TAG_BAPL { $$ = $1; START1(BAPL) }
2819 | TAG_CONL { $$ = $1; START1(CONL) }
2820 | TAG_ENDL { $$ = $1; START1(ENDL) }
2823 lio_bapl_subs : /* empty */
2824 | lio_bapl_subs lio_bapl_sub
2827 lio_bapl_sub : lio_bapl_stat_sect { OCCUR2(STAT, 0, 1) }
2828 | lio_bapl_date_sect { OCCUR2(DATE, 0, 1) }
2829 | lio_bapl_temp_sect { OCCUR2(TEMP, 0, 1) }
2830 | lio_bapl_plac_sect { OCCUR2(PLAC, 0, 1) }
2836 lio_bapl_stat_sect : OPEN DELIM TAG_STAT mand_line_item
2837 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_STAT,
2839 GEDCOM_MAKE_STRING(val1, $4));
2840 START(STAT, $1, $<ctxt>$)
2845 { end_element(ELT_SUB_LIO_BAPL_STAT, PARENT, $<ctxt>5,
2846 GEDCOM_MAKE_NULL(val1));
2849 lio_bapl_date_sect : OPEN DELIM TAG_DATE mand_line_item
2850 { struct date_value dv = gedcom_parse_date($4);
2851 $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_DATE,
2853 GEDCOM_MAKE_DATE(val1, dv));
2854 START(DATE, $1, $<ctxt>$)
2859 { end_element(ELT_SUB_LIO_BAPL_DATE, PARENT, $<ctxt>5,
2860 GEDCOM_MAKE_NULL(val1));
2863 lio_bapl_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
2864 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_TEMP,
2866 GEDCOM_MAKE_STRING(val1, $4));
2867 START(TEMP, $1, $<ctxt>$)
2872 { end_element(ELT_SUB_LIO_BAPL_TEMP, PARENT, $<ctxt>5,
2873 GEDCOM_MAKE_NULL(val1));
2876 lio_bapl_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
2877 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_PLAC,
2879 GEDCOM_MAKE_STRING(val1, $4));
2880 START(PLAC, $1, $<ctxt>$)
2885 { end_element(ELT_SUB_LIO_BAPL_PLAC, PARENT, $<ctxt>5,
2886 GEDCOM_MAKE_NULL(val1));
2890 lio_slgc_sect : OPEN DELIM TAG_SLGC
2891 { $<ctxt>$ = start_element(ELT_SUB_LIO_SLGC,
2892 PARENT, $1, $3, NULL,
2893 GEDCOM_MAKE_NULL(val1));
2894 START(SLGC, $1, $<ctxt>$)
2897 { if (compat_mode(C_NO_SLGC_FAMC) && ! CHK_COND(FAMC))
2898 compat_generate_slgc_famc_link($<ctxt>4);
2903 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4,
2904 GEDCOM_MAKE_NULL(val1));
2908 lio_slgc_subs : /* empty */
2909 | lio_slgc_subs lio_slgc_sub
2912 lio_slgc_sub : lio_bapl_sub
2913 | lio_slgc_famc_sect { OCCUR2(FAMC, 1, 1) }
2916 lio_slgc_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2917 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2919 if (xr == NULL) HANDLE_ERROR;
2921 = start_element(ELT_SUB_LIO_SLGC_FAMC,
2923 GEDCOM_MAKE_XREF_PTR(val1, xr));
2924 START(FAMC, $1, $<ctxt>$)
2929 { end_element(ELT_SUB_LIO_SLGC_FAMC, PARENT, $<ctxt>5,
2930 GEDCOM_MAKE_NULL(val1));
2934 /* LDS SPOUSE SEALING */
2935 lds_spouse_seal_sub : lss_slgs_sect
2938 lss_slgs_sect : OPEN DELIM TAG_SLGS
2939 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS,
2940 PARENT, $1, $3, NULL,
2941 GEDCOM_MAKE_NULL(val1));
2942 START(SLGS, $1, $<ctxt>$) }
2946 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4,
2947 GEDCOM_MAKE_NULL(val1));
2951 lss_slgs_subs : /* empty */
2952 | lss_slgs_subs lss_slgs_sub
2955 lss_slgs_sub : lss_slgs_stat_sect { OCCUR2(STAT, 0, 1) }
2956 | lss_slgs_date_sect { OCCUR2(DATE, 0, 1) }
2957 | lss_slgs_temp_sect { OCCUR2(TEMP, 0, 1) }
2958 | lss_slgs_plac_sect { OCCUR2(PLAC, 0, 1) }
2964 lss_slgs_stat_sect : OPEN DELIM TAG_STAT mand_line_item
2965 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_STAT,
2967 GEDCOM_MAKE_STRING(val1, $4));
2968 START(STAT, $1, $<ctxt>$)
2973 { end_element(ELT_SUB_LSS_SLGS_STAT, PARENT, $<ctxt>5,
2974 GEDCOM_MAKE_NULL(val1));
2977 lss_slgs_date_sect : OPEN DELIM TAG_DATE mand_line_item
2978 { struct date_value dv = gedcom_parse_date($4);
2979 $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_DATE,
2981 GEDCOM_MAKE_DATE(val1, dv));
2982 START(DATE, $1, $<ctxt>$)
2987 { end_element(ELT_SUB_LSS_SLGS_DATE, PARENT, $<ctxt>5,
2988 GEDCOM_MAKE_NULL(val1));
2991 lss_slgs_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
2992 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_TEMP,
2994 GEDCOM_MAKE_STRING(val1, $4));
2995 START(TEMP, $1, $<ctxt>$)
3000 { end_element(ELT_SUB_LSS_SLGS_TEMP, PARENT, $<ctxt>5,
3001 GEDCOM_MAKE_NULL(val1));
3004 lss_slgs_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
3005 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_PLAC,
3007 GEDCOM_MAKE_STRING(val1, $4));
3008 START(PLAC, $1, $<ctxt>$)
3013 { end_element(ELT_SUB_LSS_SLGS_PLAC, PARENT, $<ctxt>5,
3014 GEDCOM_MAKE_NULL(val1));
3018 /* MULTIMEDIA LINK */
3019 multim_link_sub : multim_obje_link_sect
3020 | multim_obje_emb_sect
3023 multim_obje_link_sect : OPEN DELIM TAG_OBJE DELIM POINTER
3024 { struct xref_value *xr = gedcom_parse_xref($5,
3027 if (xr == NULL) HANDLE_ERROR;
3029 = start_element(ELT_SUB_MULTIM_OBJE,
3031 GEDCOM_MAKE_XREF_PTR(val1, xr));
3032 START(OBJE, $1, $<ctxt>$)
3037 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>6,
3038 GEDCOM_MAKE_NULL(val1));
3042 multim_obje_emb_sect : OPEN DELIM TAG_OBJE
3043 { $<ctxt>$ = start_element(ELT_SUB_MULTIM_OBJE,
3044 PARENT, $1, $3, NULL,
3045 GEDCOM_MAKE_NULL(val1));
3046 START(OBJE, $1, $<ctxt>$)
3048 multim_obje_emb_subs
3049 { CHECK2(FORM,FILE) }
3051 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>4,
3052 GEDCOM_MAKE_NULL(val1));
3056 multim_obje_emb_subs : /* empty */
3057 | multim_obje_emb_subs multim_obje_emb_sub
3060 multim_obje_emb_sub : multim_obje_form_sect { OCCUR2(FORM, 1, 1) }
3061 | multim_obje_titl_sect { OCCUR2(TITL, 0, 1) }
3062 | multim_obje_file_sect { OCCUR2(FILE, 1, 1) }
3067 multim_obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
3069 = start_element(ELT_SUB_MULTIM_OBJE_FORM,
3071 GEDCOM_MAKE_STRING(val1, $4));
3072 START(FORM, $1, $<ctxt>$)
3077 { end_element(ELT_SUB_MULTIM_OBJE_FORM,
3079 GEDCOM_MAKE_NULL(val1));
3082 multim_obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
3084 = start_element(ELT_SUB_MULTIM_OBJE_TITL,
3086 GEDCOM_MAKE_STRING(val1, $4));
3087 START(TITL, $1, $<ctxt>$)
3092 { end_element(ELT_SUB_MULTIM_OBJE_TITL,
3094 GEDCOM_MAKE_NULL(val1));
3097 multim_obje_file_sect : OPEN DELIM TAG_FILE mand_line_item
3099 = start_element(ELT_SUB_MULTIM_OBJE_FILE,
3101 GEDCOM_MAKE_STRING(val1, $4));
3102 START(FILE, $1, $<ctxt>$)
3107 { end_element(ELT_SUB_MULTIM_OBJE_FILE,
3109 GEDCOM_MAKE_NULL(val1));
3113 /* NOTE STRUCTURE */
3114 note_struc_sub : note_struc_link_sect /* 0:M */
3115 | note_struc_emb_sect /* 0:M */
3118 note_struc_link_sect : OPEN DELIM TAG_NOTE DELIM POINTER
3119 { struct xref_value *xr = gedcom_parse_xref($5,
3122 if (xr == NULL) HANDLE_ERROR;
3124 = start_element(ELT_SUB_NOTE,
3126 GEDCOM_MAKE_XREF_PTR(val1, xr));
3127 START(NOTE, $1, $<ctxt>$)
3129 note_struc_link_subs
3132 { end_element(ELT_SUB_NOTE, PARENT, $<ctxt>6,
3133 GEDCOM_MAKE_NULL(val1));
3137 note_struc_link_subs : /* empty */
3138 | note_struc_link_subs note_struc_link_sub
3141 note_struc_link_sub : source_cit_sub
3145 note_struc_emb_sect : OPEN DELIM TAG_NOTE opt_line_item
3147 = start_element(ELT_SUB_NOTE,
3149 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
3150 reset_buffer(&concat_buffer);
3152 safe_buf_append(&concat_buffer, $4);
3153 START(NOTE, $1, $<ctxt>$)
3158 { char* complete = get_buf_string(&concat_buffer);
3159 end_element(ELT_SUB_NOTE, PARENT, $<ctxt>5,
3160 GEDCOM_MAKE_STRING(val1, complete));
3164 note_struc_emb_subs : /* empty */
3165 | note_struc_emb_subs note_struc_emb_sub
3168 note_struc_emb_sub : continuation_sub
3173 /* PERSONAL NAME STRUCTURE */
3174 pers_name_struc_sub : pers_name_sect /* 0:M */
3177 pers_name_sect : OPEN DELIM TAG_NAME mand_line_item
3178 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME,
3180 GEDCOM_MAKE_STRING(val1, $4));
3181 START(NAME, $1, $<ctxt>$)
3186 { end_element(ELT_SUB_PERS_NAME, PARENT, $<ctxt>5,
3187 GEDCOM_MAKE_NULL(val1));
3191 pers_name_subs : /* empty */
3192 | pers_name_subs pers_name_sub
3195 pers_name_sub : pers_name_npfx_sect { OCCUR2(NPFX, 0, 1) }
3196 | pers_name_givn_sect { OCCUR2(GIVN, 0, 1) }
3197 | pers_name_nick_sect { OCCUR2(NICK, 0, 1) }
3198 | pers_name_spfx_sect { OCCUR2(SPFX, 0, 1) }
3199 | pers_name_surn_sect { OCCUR2(SURN, 0, 1) }
3200 | pers_name_nsfx_sect { OCCUR2(NSFX, 0, 1) }
3206 pers_name_npfx_sect : OPEN DELIM TAG_NPFX mand_line_item
3207 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NPFX,
3209 GEDCOM_MAKE_STRING(val1, $4));
3210 START(NPFX, $1, $<ctxt>$)
3215 { end_element(ELT_SUB_PERS_NAME_NPFX, PARENT, $<ctxt>5,
3216 GEDCOM_MAKE_NULL(val1));
3219 pers_name_givn_sect : OPEN DELIM TAG_GIVN mand_line_item
3220 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_GIVN,
3222 GEDCOM_MAKE_STRING(val1, $4));
3223 START(GIVN, $1, $<ctxt>$)
3228 { end_element(ELT_SUB_PERS_NAME_GIVN, PARENT, $<ctxt>5,
3229 GEDCOM_MAKE_NULL(val1));
3232 pers_name_nick_sect : OPEN DELIM TAG_NICK mand_line_item
3233 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NICK,
3235 GEDCOM_MAKE_STRING(val1, $4));
3236 START(NICK, $1, $<ctxt>$)
3241 { end_element(ELT_SUB_PERS_NAME_NICK, PARENT, $<ctxt>5,
3242 GEDCOM_MAKE_NULL(val1));
3245 pers_name_spfx_sect : OPEN DELIM TAG_SPFX mand_line_item
3246 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SPFX,
3248 GEDCOM_MAKE_STRING(val1, $4));
3249 START(SPFX, $1, $<ctxt>$)
3254 { end_element(ELT_SUB_PERS_NAME_SPFX, PARENT, $<ctxt>5,
3255 GEDCOM_MAKE_NULL(val1));
3258 pers_name_surn_sect : OPEN DELIM TAG_SURN mand_line_item
3259 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SURN,
3261 GEDCOM_MAKE_STRING(val1, $4));
3262 START(SURN, $1, $<ctxt>$)
3267 { end_element(ELT_SUB_PERS_NAME_SURN, PARENT, $<ctxt>5,
3268 GEDCOM_MAKE_NULL(val1));
3271 pers_name_nsfx_sect : OPEN DELIM TAG_NSFX mand_line_item
3272 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NSFX,
3274 GEDCOM_MAKE_STRING(val1, $4));
3275 START(NSFX, $1, $<ctxt>$)
3280 { end_element(ELT_SUB_PERS_NAME_NSFX, PARENT, $<ctxt>5,
3281 GEDCOM_MAKE_NULL(val1));
3285 /* PLACE STRUCTURE */
3286 place_struc_sub : place_struc_plac_sect /* 0:M */
3289 place_struc_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
3291 = start_element(ELT_SUB_PLAC,
3293 GEDCOM_MAKE_STRING(val1, $4));
3294 START(PLAC, $1, $<ctxt>$)
3296 place_struc_plac_subs
3299 { end_element(ELT_SUB_PLAC, PARENT, $<ctxt>5,
3300 GEDCOM_MAKE_NULL(val1));
3304 place_struc_plac_subs : /* empty */
3305 | place_struc_plac_subs place_struc_plac_sub
3308 place_struc_plac_sub : place_plac_form_sect { OCCUR2(FORM, 0, 1) }
3314 place_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
3316 = start_element(ELT_SUB_PLAC_FORM,
3318 GEDCOM_MAKE_STRING(val1, $4));
3319 START(FORM, $1, $<ctxt>$)
3324 { end_element(ELT_SUB_PLAC_FORM, PARENT, $<ctxt>5,
3325 GEDCOM_MAKE_NULL(val1));
3329 /* SOURCE_CITATION */
3330 source_cit_sub : source_cit_link_sect /* 0:M */
3331 | source_cit_emb_sect /* 0:M */
3334 source_cit_link_sect : OPEN DELIM TAG_SOUR DELIM POINTER
3335 { struct xref_value *xr = gedcom_parse_xref($5,
3338 if (xr == NULL) HANDLE_ERROR;
3340 = start_element(ELT_SUB_SOUR,
3342 GEDCOM_MAKE_XREF_PTR(val1, xr));
3343 START(SOUR, $1, $<ctxt>$)
3345 source_cit_link_subs
3348 { end_element(ELT_SUB_SOUR, PARENT, $<ctxt>6,
3349 GEDCOM_MAKE_NULL(val1));
3353 source_cit_link_subs : /* empty */
3354 | source_cit_link_subs source_cit_link_sub
3357 source_cit_link_sub : source_cit_page_sect { OCCUR2(PAGE, 0, 1) }
3358 | source_cit_even_sect { OCCUR2(EVEN, 0, 1) }
3359 | source_cit_data_sect { OCCUR2(DATA, 0, 1) }
3360 | source_cit_quay_sect { OCCUR2(QUAY, 0, 1) }
3366 source_cit_page_sect : OPEN DELIM TAG_PAGE mand_line_item
3368 = start_element(ELT_SUB_SOUR_PAGE,
3370 GEDCOM_MAKE_STRING(val1, $4));
3371 START(PAGE, $1, $<ctxt>$)
3376 { end_element(ELT_SUB_SOUR_PAGE, PARENT, $<ctxt>5,
3377 GEDCOM_MAKE_NULL(val1));
3381 source_cit_even_sect : OPEN DELIM TAG_EVEN mand_line_item
3383 = start_element(ELT_SUB_SOUR_EVEN,
3385 GEDCOM_MAKE_STRING(val1, $4));
3386 START(EVEN, $1, $<ctxt>$)
3388 source_cit_even_subs
3391 { end_element(ELT_SUB_SOUR_EVEN, PARENT, $<ctxt>5,
3392 GEDCOM_MAKE_NULL(val1));
3396 source_cit_even_subs : /* empty */
3397 | source_cit_even_subs source_cit_even_sub
3400 source_cit_even_sub : source_cit_even_role_sect { OCCUR2(ROLE, 0, 1) }
3404 source_cit_even_role_sect : OPEN DELIM TAG_ROLE mand_line_item
3406 = start_element(ELT_SUB_SOUR_EVEN_ROLE,
3408 GEDCOM_MAKE_STRING(val1, $4));
3409 START(ROLE, $1, $<ctxt>$)
3414 { end_element(ELT_SUB_SOUR_EVEN_ROLE,
3416 GEDCOM_MAKE_NULL(val1));
3420 source_cit_data_sect : OPEN DELIM TAG_DATA
3421 { $<ctxt>$ = start_element(ELT_SUB_SOUR_DATA,
3422 PARENT, $1, $3, NULL,
3423 GEDCOM_MAKE_NULL(val1));
3424 START(DATA, $1, $<ctxt>$)
3426 source_cit_data_subs
3429 { end_element(ELT_SUB_SOUR_DATA, PARENT, $<ctxt>4,
3430 GEDCOM_MAKE_NULL(val1));
3434 source_cit_data_subs : /* empty */
3435 | source_cit_data_subs source_cit_data_sub
3438 source_cit_data_sub : source_cit_data_date_sect { OCCUR2(DATE, 0, 1) }
3439 | source_cit_text_sect /* 0:M */
3443 source_cit_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
3444 { struct date_value dv = gedcom_parse_date($4);
3446 = start_element(ELT_SUB_SOUR_DATA_DATE,
3448 GEDCOM_MAKE_DATE(val1, dv));
3449 START(DATE, $1, $<ctxt>$)
3454 { end_element(ELT_SUB_SOUR_DATA_DATE,
3456 GEDCOM_MAKE_NULL(val1));
3460 source_cit_text_sect : OPEN DELIM TAG_TEXT mand_line_item
3462 = start_element(ELT_SUB_SOUR_TEXT,
3464 GEDCOM_MAKE_STRING(val1, $4));
3465 reset_buffer(&concat_buffer);
3466 safe_buf_append(&concat_buffer, $4);
3467 START(TEXT, $1, $<ctxt>$)
3469 source_cit_text_subs
3472 { char* complete = get_buf_string(&concat_buffer);
3473 end_element(ELT_SUB_SOUR_TEXT, PARENT, $<ctxt>5,
3474 GEDCOM_MAKE_STRING(val1, complete));
3478 source_cit_text_subs : /* empty */
3479 | source_cit_text_subs source_cit_text_sub
3482 source_cit_text_sub : continuation_sub
3486 source_cit_quay_sect : OPEN DELIM TAG_QUAY mand_line_item
3488 = start_element(ELT_SUB_SOUR_QUAY,
3490 GEDCOM_MAKE_STRING(val1, $4));
3491 START(QUAY, $1, $<ctxt>$)
3496 { end_element(ELT_SUB_SOUR_QUAY, PARENT, $<ctxt>5,
3497 GEDCOM_MAKE_NULL(val1));
3501 source_cit_emb_sect : OPEN DELIM TAG_SOUR mand_line_item
3502 { $<ctxt>$ = start_element(ELT_SUB_SOUR,
3504 GEDCOM_MAKE_STRING(val1, $4));
3505 reset_buffer(&concat_buffer);
3506 safe_buf_append(&concat_buffer, $4);
3507 START(SOUR, $1, $<ctxt>$)
3512 { char* complete = get_buf_string(&concat_buffer);
3513 end_element(ELT_SUB_SOUR, PARENT, $<ctxt>5,
3514 GEDCOM_MAKE_STRING(val1, complete));
3518 source_cit_emb_subs : /* empty */
3519 | source_cit_emb_subs source_cit_emb_sub
3522 source_cit_emb_sub : continuation_sub
3523 | source_cit_text_sect /* 0:M */
3528 /* SOURCE REPOSITORY CITATION */
3529 source_repos_cit_sub : source_repos_repo_sect { OCCUR2(REPO, 0, 1) }
3532 source_repos_repo_sect : OPEN DELIM TAG_REPO mand_pointer
3533 { struct xref_value *xr
3534 = gedcom_parse_xref($4, XREF_USED, XREF_REPO);
3535 if (xr == NULL) HANDLE_ERROR;
3537 = start_element(ELT_SUB_REPO,
3539 GEDCOM_MAKE_XREF_PTR(val1, xr));
3540 START(REPO, $1, $<ctxt>$)
3542 source_repos_repo_subs
3545 { end_element(ELT_SUB_REPO, PARENT, $<ctxt>5,
3546 GEDCOM_MAKE_NULL(val1));
3550 source_repos_repo_subs : /* empty */
3551 | source_repos_repo_subs source_repos_repo_sub
3554 source_repos_repo_sub : note_struc_sub
3555 | caln_sect /* 0:M */
3559 caln_sect : OPEN DELIM TAG_CALN mand_line_item
3560 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN,
3562 GEDCOM_MAKE_STRING(val1, $4));
3563 START(CALN, $1, $<ctxt>$)
3568 { end_element(ELT_SUB_REPO_CALN, PARENT, $<ctxt>5,
3569 GEDCOM_MAKE_NULL(val1));
3573 caln_subs : /* empty */
3574 | caln_subs caln_sub
3577 caln_sub : caln_medi_sect { OCCUR2(MEDI, 0, 1) }
3581 caln_medi_sect : OPEN DELIM TAG_MEDI mand_line_item
3582 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN_MEDI,
3584 GEDCOM_MAKE_STRING(val1, $4));
3585 START(MEDI, $1, $<ctxt>$)
3590 { end_element(ELT_SUB_REPO_CALN_MEDI, PARENT, $<ctxt>5,
3591 GEDCOM_MAKE_NULL(val1));
3595 /* SPOUSE TO FAMILY LINK */
3596 spou_fam_link_sub : spou_fam_fams_sect /* 0:M */
3599 spou_fam_fams_sect : OPEN DELIM TAG_FAMS mand_pointer
3600 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
3602 if (xr == NULL) HANDLE_ERROR;
3604 = start_element(ELT_SUB_FAMS,
3606 GEDCOM_MAKE_XREF_PTR(val1, xr));
3607 START(FAMS, $1, $<ctxt>$)
3612 { end_element(ELT_SUB_FAMS, PARENT, $<ctxt>5,
3613 GEDCOM_MAKE_NULL(val1));
3617 spou_fam_fams_subs : /* empty */
3618 | spou_fam_fams_subs spou_fam_fams_sub
3621 spou_fam_fams_sub : note_struc_sub
3625 /*********************************************************************/
3627 /*********************************************************************/
3629 no_std_subs : /* empty */
3630 | no_std_subs no_std_sub
3633 no_std_sub : user_sect /* 0:M */
3636 CLOSE { HANDLE_ERROR }
3639 no_std_rec : user_rec /* 0:M */
3642 CLOSE { HANDLE_ERROR }
3645 user_rec : OPEN DELIM opt_xref USERTAG
3646 { if ($4.string[0] != '_') {
3647 if (compat_mode(C_551_TAGS)
3648 && compat_check_551_tag($4.string, &usertag_buffer)) {
3649 $4.string = get_buf_string(&usertag_buffer);
3652 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3659 { struct xref_value *xr = NULL;
3661 xr = gedcom_parse_xref($3, XREF_DEFINED, XREF_USER);
3662 if (xr == NULL) HANDLE_ERROR;
3664 $<ctxt>$ = start_record(REC_USER,
3666 GEDCOM_MAKE_NULL_OR_XREF_PTR(val1, xr),
3668 START($4, $1, $<ctxt>$)
3673 { end_record(REC_USER, $<ctxt>7, GEDCOM_MAKE_NULL(val1)); }
3675 user_sect : OPEN DELIM opt_xref USERTAG
3676 { if ($4.string[0] != '_') {
3677 if (compat_mode(C_551_TAGS)
3678 && compat_check_551_tag($4.string, &usertag_buffer)) {
3679 $4.string = get_buf_string(&usertag_buffer);
3682 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3689 { $<ctxt>$ = start_element(ELT_USER, PARENT, $1, $4, $6, &val2);
3690 START($4, $1, $<ctxt>$);
3695 { end_element(ELT_USER, PARENT, $<ctxt>7,
3696 GEDCOM_MAKE_NULL(val1));
3700 user_sects : /* empty */ { }
3701 | user_sects user_sect { }
3704 opt_xref : /* empty */ { $$ = NULL; }
3705 | POINTER DELIM { $$ = $1; }
3708 opt_value : /* empty */ { GEDCOM_MAKE_NULL(val2);
3710 | DELIM POINTER { struct xref_value *xr
3711 = gedcom_parse_xref($2, XREF_USED,
3713 GEDCOM_MAKE_XREF_PTR(val2, xr);
3715 | DELIM line_item { GEDCOM_MAKE_STRING(val2, $2);
3719 mand_pointer : /* empty */ { gedcom_error(_("Missing pointer")); YYERROR; }
3720 | DELIM POINTER { gedcom_debug_print("==Ptr: %s==", $2);
3724 mand_line_item : /* empty */
3725 { if (compat_mode(C_NO_REQUIRED_VALUES)) {
3726 gedcom_debug_print("==Val: ==");
3730 gedcom_error(_("Missing value")); YYERROR;
3733 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3737 opt_line_item : /* empty */ { $$ = NULL; }
3738 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3742 line_item : anychar { size_t i;
3743 reset_buffer(&line_item_buffer);
3744 /* The following also takes care of '@@' */
3745 if (!strncmp($1, "@@", 3))
3746 SAFE_BUF_ADDCHAR(&line_item_buffer, '@')
3748 for (i=0; i < strlen($1); i++)
3749 SAFE_BUF_ADDCHAR(&line_item_buffer, $1[i])
3750 $$ = get_buf_string(&line_item_buffer);
3752 | ESCAPE { size_t i;
3753 reset_buffer(&line_item_buffer);
3754 for (i=0; i < strlen($1); i++)
3755 SAFE_BUF_ADDCHAR(&line_item_buffer, $1[i])
3756 $$ = get_buf_string(&line_item_buffer);
3760 /* The following also takes care of '@@' */
3761 if (!strncmp($2, "@@", 3))
3762 SAFE_BUF_ADDCHAR(&line_item_buffer, '@')
3764 for (i=0; i < strlen($2); i++)
3765 SAFE_BUF_ADDCHAR(&line_item_buffer, $2[i])
3766 $$ = get_buf_string(&line_item_buffer);
3770 for (i=0; i < strlen($2); i++)
3771 SAFE_BUF_ADDCHAR(&line_item_buffer, $2[i])
3772 $$ = get_buf_string(&line_item_buffer);
3774 | line_item error anychar { HANDLE_ERROR; }
3775 | line_item error ESCAPE { HANDLE_ERROR; }
3778 anychar : ANYCHAR { }
3782 error_subs : /* empty */
3783 | error_subs error_sect
3786 error_sect : OPEN DELIM opt_xref anytag opt_value error_subs CLOSE { }
3789 gen_sect : OPEN DELIM opt_xref anystdtag
3790 { INVALID_TAG($4.string); }
3791 opt_value opt_sects CLOSE
3795 gen_rec : gen_rec_top
3799 gen_rec_norm : OPEN DELIM opt_xref anystdtag
3800 { INVALID_TOP_TAG($4.string) }
3801 opt_value opt_sects CLOSE
3805 gen_rec_top : OPEN DELIM anytoptag
3806 { gedcom_error(_("Missing cross-reference")); YYERROR; }
3807 opt_value opt_sects CLOSE
3811 opt_sects : /* empty */ { }
3812 | opt_sects gen_sect { }
3815 anytag : USERTAG { }
3829 anystdtag : TAG_ABBR
3960 /* Functions that handle the counting of subtags */
3962 int* count_arrays[MAXGEDCLEVEL+1];
3963 char tag_stack[MAXGEDCLEVEL+1][MAXSTDTAGLEN+1];
3964 Gedcom_ctxt ctxt_stack[MAXGEDCLEVEL+1];
3966 void push_countarray(int level)
3969 gedcom_debug_print("Push Count level: %d, level: %d\n", count_level, level);
3970 if (count_level != level + 1) {
3971 gedcom_error(_("Internal error: count level mismatch"));
3974 if (count_level > MAXGEDCLEVEL) {
3975 gedcom_error(_("Internal error: count array overflow"));
3979 gedcom_debug_print("calloc countarray %d\n", count_level);
3980 count = (int *)calloc(YYNTOKENS, sizeof(int));
3981 if (count == NULL) {
3982 gedcom_error(_("Internal error: count array calloc error"));
3986 count_arrays[count_level] = count;
3991 void set_parenttag(const char* tag)
3993 strncpy(tag_stack[count_level+1], tag, MAXSTDTAGLEN+1);
3996 void set_parentctxt(Gedcom_ctxt ctxt)
3998 ctxt_stack[count_level+1] = ctxt;
4001 char* get_parenttag(int offset)
4003 return tag_stack[count_level - offset];
4006 Gedcom_ctxt get_parentctxt(int offset)
4008 return ctxt_stack[count_level - offset];
4011 int count_tag(int tag)
4013 int *count = count_arrays[count_level];
4014 return ++count[tag - GEDCOMTAGOFFSET];
4017 int check_occurrence(int tag)
4019 int *count = count_arrays[count_level];
4020 return (count[tag - GEDCOMTAGOFFSET] > 0);
4023 void pop_countarray()
4026 gedcom_debug_print("Pop Count level: %d\n", count_level);
4027 if (count_level < 0) {
4028 gedcom_error(_("Internal error: count array underflow"));
4032 count = count_arrays[count_level];
4033 gedcom_debug_print("free countarray %d\n", count_level);
4035 count_arrays[count_level] = NULL;
4041 gedcom_debug_print("Cleanup countarrays\n");
4042 while (count_level > 0) {
4048 void cleanup_concat_buffer()
4050 cleanup_buffer(&concat_buffer);
4053 void cleanup_line_item_buffer()
4055 cleanup_buffer(&line_item_buffer);
4058 void cleanup_usertag_buffer()
4060 cleanup_buffer(&usertag_buffer);
4063 /* Enabling debug mode */
4064 /* level 0: no debugging */
4065 /* level 1: only internal */
4066 /* level 2: also bison */
4069 void gedcom_set_debug_level(int level, FILE* f)
4074 trace_output = stderr;
4076 gedcom_high_level_debug = 1;
4085 int gedcom_debug_print(const char* s, ...)
4088 if (gedcom_high_level_debug) {
4091 res = vfprintf(trace_output, s, ap);
4093 fprintf(trace_output, "\n");
4098 /* Setting the error mechanism */
4099 void gedcom_set_error_handling(Gedcom_err_mech mechanism)
4101 error_mechanism = mechanism;