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 START(ADDR, $1 + 1, $<ctxt>$);
1239 else { START(ADDR, $1, NULL) }
1244 { if (compat_mode(C_INDI_ADDR)) {
1245 Gedcom_ctxt par = PARENT;
1246 end_element(ELT_SUB_ADDR, par, $<ctxt>5,
1247 GEDCOM_MAKE_NULL(val1));
1249 compat_generate_resi_end(PARENT, par);
1254 ftree_addr_subs : /* empty */
1255 | ftree_addr_subs ftree_addr_sub
1258 ftree_addr_sub : continuation_sub
1259 | ftree_addr_phon_sect
1263 ftree_addr_phon_sect : OPEN DELIM TAG_PHON mand_line_item
1265 = start_element(ELT_SUB_PHON,
1266 GRANDPARENT(1), $1, $3, $4,
1267 GEDCOM_MAKE_STRING(val1, $4));
1268 START(PHON, $1, $<ctxt>$)
1273 { end_element(ELT_SUB_PHON, GRANDPARENT(1),
1274 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1278 /*********************************************************************/
1279 /**** Multimedia record ****/
1280 /*********************************************************************/
1281 multim_rec : OPEN DELIM POINTER DELIM TAG_OBJE
1282 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1284 if (xr == NULL) HANDLE_ERROR;
1285 $<ctxt>$ = start_record(REC_OBJE,
1286 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1287 NULL, GEDCOM_MAKE_NULL(val2));
1288 START(OBJE, $1, $<ctxt>$) }
1290 { CHECK2(FORM, BLOB) }
1292 { end_record(REC_OBJE, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1295 obje_subs : /* empty */
1296 | obje_subs obje_sub
1299 obje_sub : obje_form_sect { OCCUR2(FORM, 1, 1) }
1300 | obje_titl_sect { OCCUR2(TITL, 0, 1) }
1301 | note_struc_sub /* 0:M */
1302 | obje_blob_sect { OCCUR2(BLOB, 1, 1) }
1303 | obje_obje_sect { OCCUR2(OBJE, 0, 1) }
1304 | ident_struc_sub /* 0:1 */
1305 | change_date_sub /* 0:1 */
1310 obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
1311 { $<ctxt>$ = start_element(ELT_OBJE_FORM,
1313 GEDCOM_MAKE_STRING(val1, $4));
1314 START(FORM, $1, $<ctxt>$)
1319 { end_element(ELT_OBJE_FORM, PARENT, $<ctxt>5,
1320 GEDCOM_MAKE_NULL(val1));
1325 obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1326 { $<ctxt>$ = start_element(ELT_OBJE_TITL,
1328 GEDCOM_MAKE_STRING(val1, $4));
1329 START(TITL, $1, $<ctxt>$)
1334 { end_element(ELT_OBJE_TITL, PARENT, $<ctxt>5,
1335 GEDCOM_MAKE_NULL(val1));
1340 obje_blob_sect : OPEN DELIM TAG_BLOB
1341 { $<ctxt>$ = start_element(ELT_OBJE_BLOB,
1342 PARENT, $1, $3, NULL,
1343 GEDCOM_MAKE_NULL(val1));
1344 reset_buffer(&concat_buffer);
1345 START(BLOB, $1, $<ctxt>$)
1350 { char* complete = get_buf_string(&concat_buffer);
1351 end_element(ELT_OBJE_BLOB, PARENT, $<ctxt>4,
1352 GEDCOM_MAKE_STRING(val1, complete));
1356 obje_blob_subs : /* empty */
1357 | obje_blob_subs obje_blob_sub
1360 obje_blob_sub : obje_blob_cont_sect { OCCUR1(CONT, 1) }
1364 obje_blob_cont_sect : OPEN DELIM TAG_CONT mand_line_item
1365 { $<ctxt>$ = start_element(ELT_OBJE_BLOB_CONT,
1367 GEDCOM_MAKE_STRING(val1, $4));
1368 safe_buf_append(&concat_buffer, $4);
1369 START(CONT, $1, $<ctxt>$)
1374 { end_element(ELT_OBJE_BLOB_CONT, PARENT,
1375 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1380 obje_obje_sect : OPEN DELIM TAG_OBJE mand_pointer
1381 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1383 if (xr == NULL) HANDLE_ERROR;
1384 $<ctxt>$ = start_element(ELT_OBJE_OBJE,
1386 GEDCOM_MAKE_XREF_PTR(val1, xr));
1387 START(OBJE, $1, $<ctxt>$)
1392 { end_element(ELT_OBJE_OBJE, PARENT, $<ctxt>5,
1393 GEDCOM_MAKE_NULL(val1));
1397 /*********************************************************************/
1398 /**** Note record ****/
1399 /*********************************************************************/
1400 note_rec : OPEN DELIM POINTER DELIM TAG_NOTE note_line_item
1401 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1403 if (xr == NULL) HANDLE_ERROR;
1404 $<ctxt>$ = start_record(REC_NOTE,
1405 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1406 $6, GEDCOM_MAKE_STRING(val2, $6));
1407 reset_buffer(&concat_buffer);
1408 safe_buf_append(&concat_buffer, $6);
1409 START(NOTE, $1, $<ctxt>$) }
1413 { char* complete = get_buf_string(&concat_buffer);
1414 end_record(REC_NOTE, $<ctxt>7,
1415 GEDCOM_MAKE_STRING(val1, complete)); }
1418 note_line_item : /* empty */
1419 { if (!compat_mode(C_NOTE_NO_VALUE)) {
1420 gedcom_error(_("Missing value")); YYERROR;
1427 { gedcom_debug_print("==Val: %s==", $2);
1431 note_subs : /* empty */
1432 | note_subs note_sub
1435 note_sub : continuation_sub /* 0:M */
1436 | source_cit_sub /* 0:M */
1437 | ident_struc_sub /* 0:1 */
1438 | change_date_sub /* 0:1 */
1442 /*********************************************************************/
1443 /**** Repository record ****/
1444 /*********************************************************************/
1445 repos_rec : OPEN DELIM POINTER DELIM TAG_REPO
1446 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1448 if (xr == NULL) HANDLE_ERROR;
1449 $<ctxt>$ = start_record(REC_REPO,
1450 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1451 NULL, GEDCOM_MAKE_NULL(val2));
1452 START(REPO, $1, $<ctxt>$) }
1456 { end_record(REC_REPO, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1459 repo_subs : /* empty */
1460 | repo_subs repo_sub
1463 repo_sub : repo_name_sect { OCCUR2(NAME, 0, 1) }
1464 | addr_struc_sub /* 0:1 */
1465 | note_struc_sub /* 0:M */
1466 | ident_struc_sub /* 0:1 */
1467 | change_date_sub /* 0:1 */
1472 repo_name_sect : OPEN DELIM TAG_NAME mand_line_item
1473 { $<ctxt>$ = start_element(ELT_REPO_NAME,
1475 GEDCOM_MAKE_STRING(val1, $4));
1476 START(NAME, $1, $<ctxt>$)
1481 { end_element(ELT_REPO_NAME, PARENT, $<ctxt>5,
1482 GEDCOM_MAKE_NULL(val1));
1486 /*********************************************************************/
1487 /**** Source record ****/
1488 /*********************************************************************/
1489 source_rec : OPEN DELIM POINTER DELIM TAG_SOUR
1490 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1492 if (xr == NULL) HANDLE_ERROR;
1493 $<ctxt>$ = start_record(REC_SOUR,
1494 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1495 NULL, GEDCOM_MAKE_NULL(val2));
1496 START(SOUR, $1, $<ctxt>$) }
1500 { end_record(REC_SOUR, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1503 sour_subs : /* empty */
1504 | sour_subs sour_sub
1507 sour_sub : sour_data_sect { OCCUR2(DATA, 0, 1) }
1508 | sour_auth_sect { OCCUR2(AUTH, 0, 1) }
1509 | sour_titl_sect { OCCUR2(TITL, 0, 1) }
1510 | sour_abbr_sect { OCCUR2(ABBR, 0, 1) }
1511 | sour_publ_sect { OCCUR2(PUBL, 0, 1) }
1512 | sour_text_sect { OCCUR2(TEXT, 0, 1) }
1513 | source_repos_cit_sub /* 0:1 */
1514 | multim_link_sub /* 0:M */
1515 | note_struc_sub /* 0:M */
1516 | ident_struc_sub /* 0:1 */
1517 | change_date_sub /* 0:1 */
1522 sour_data_sect : OPEN DELIM TAG_DATA
1523 { $<ctxt>$ = start_element(ELT_SOUR_DATA,
1524 PARENT, $1, $3, NULL,
1525 GEDCOM_MAKE_NULL(val1));
1526 START(DATA, $1, $<ctxt>$)
1531 { end_element(ELT_SOUR_DATA, PARENT, $<ctxt>4,
1532 GEDCOM_MAKE_NULL(val1));
1536 sour_data_subs : /* empty */
1537 | sour_data_subs sour_data_sub
1540 sour_data_sub : sour_data_even_sect /* 0:M */
1541 | sour_data_agnc_sect { OCCUR2(AGNC, 0, 1) }
1542 | note_struc_sub /* 0:M */
1546 sour_data_even_sect : OPEN DELIM TAG_EVEN mand_line_item
1547 { $<ctxt>$ = start_element(ELT_SOUR_DATA_EVEN,
1549 GEDCOM_MAKE_STRING(val1, $4));
1550 START(EVEN, $1, $<ctxt>$)
1555 { end_element(ELT_SOUR_DATA_EVEN, PARENT,
1556 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1560 sour_data_even_subs : /* empty */
1561 | sour_data_even_subs sour_data_even_sub
1564 sour_data_even_sub : sour_data_even_date_sect { OCCUR2(DATE, 0, 1) }
1565 | sour_data_even_plac_sect { OCCUR2(PLAC, 0, 1) }
1569 sour_data_even_date_sect : OPEN DELIM TAG_DATE mand_line_item
1570 { struct date_value dv = gedcom_parse_date($4);
1572 = start_element(ELT_SOUR_DATA_EVEN_DATE,
1574 GEDCOM_MAKE_DATE(val1, dv));
1575 START(DATE, $1, $<ctxt>$)
1580 { end_element(ELT_SOUR_DATA_EVEN_DATE, PARENT,
1581 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1585 sour_data_even_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
1587 = start_element(ELT_SOUR_DATA_EVEN_PLAC,
1589 GEDCOM_MAKE_STRING(val1, $4));
1590 START(PLAC, $1, $<ctxt>$)
1595 { end_element(ELT_SOUR_DATA_EVEN_PLAC, PARENT,
1596 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1600 sour_data_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
1601 { $<ctxt>$ = start_element(ELT_SOUR_DATA_AGNC,
1603 GEDCOM_MAKE_STRING(val1, $4));
1604 START(AGNC, $1, $<ctxt>$)
1609 { end_element(ELT_SOUR_DATA_AGNC, PARENT,
1610 $<ctxt>5, GEDCOM_MAKE_NULL(val1));
1615 sour_auth_sect : OPEN DELIM TAG_AUTH mand_line_item
1616 { $<ctxt>$ = start_element(ELT_SOUR_AUTH,
1618 GEDCOM_MAKE_STRING(val1, $4));
1619 reset_buffer(&concat_buffer);
1620 safe_buf_append(&concat_buffer, $4);
1621 START(AUTH, $1, $<ctxt>$)
1626 { char* complete = get_buf_string(&concat_buffer);
1627 end_element(ELT_SOUR_AUTH, PARENT, $<ctxt>5,
1628 GEDCOM_MAKE_STRING(val1, complete));
1632 sour_auth_subs : /* empty */
1633 | sour_auth_subs sour_auth_sub
1636 sour_auth_sub : continuation_sub /* 0:M */
1641 sour_titl_sect : OPEN DELIM TAG_TITL mand_line_item
1642 { $<ctxt>$ = start_element(ELT_SOUR_TITL,
1644 GEDCOM_MAKE_STRING(val1, $4));
1645 reset_buffer(&concat_buffer);
1646 safe_buf_append(&concat_buffer, $4);
1647 START(TITL, $1, $<ctxt>$)
1652 { char* complete = get_buf_string(&concat_buffer);
1653 end_element(ELT_SOUR_TITL, PARENT, $<ctxt>5,
1654 GEDCOM_MAKE_STRING(val1, complete));
1658 sour_titl_subs : /* empty */
1659 | sour_titl_subs sour_titl_sub
1662 sour_titl_sub : continuation_sub /* 0:M */
1667 sour_abbr_sect : OPEN DELIM TAG_ABBR mand_line_item
1668 { $<ctxt>$ = start_element(ELT_SOUR_ABBR,
1670 GEDCOM_MAKE_STRING(val1, $4));
1671 START(ABBR, $1, $<ctxt>$)
1676 { end_element(ELT_SOUR_ABBR, PARENT, $<ctxt>5,
1677 GEDCOM_MAKE_NULL(val1));
1682 sour_publ_sect : OPEN DELIM TAG_PUBL mand_line_item
1683 { $<ctxt>$ = start_element(ELT_SOUR_PUBL,
1685 GEDCOM_MAKE_STRING(val1, $4));
1686 reset_buffer(&concat_buffer);
1687 safe_buf_append(&concat_buffer, $4);
1688 START(PUBL, $1, $<ctxt>$)
1693 { char* complete = get_buf_string(&concat_buffer);
1694 end_element(ELT_SOUR_PUBL, PARENT, $<ctxt>5,
1695 GEDCOM_MAKE_STRING(val1, complete));
1699 sour_publ_subs : /* empty */
1700 | sour_publ_subs sour_publ_sub
1703 sour_publ_sub : continuation_sub /* 0:M */
1708 sour_text_sect : OPEN DELIM TAG_TEXT mand_line_item
1709 { $<ctxt>$ = start_element(ELT_SOUR_TEXT,
1711 GEDCOM_MAKE_STRING(val1, $4));
1712 reset_buffer(&concat_buffer);
1713 safe_buf_append(&concat_buffer, $4);
1714 START(TEXT, $1, $<ctxt>$)
1719 { char* complete = get_buf_string(&concat_buffer);
1720 end_element(ELT_SOUR_TEXT, PARENT, $<ctxt>5,
1721 GEDCOM_MAKE_STRING(val1, complete));
1725 sour_text_subs : /* empty */
1726 | sour_text_subs sour_text_sub
1729 sour_text_sub : continuation_sub /* 0:M */
1733 /*********************************************************************/
1734 /**** Submission record ****/
1735 /*********************************************************************/
1736 submis_rec : OPEN DELIM POINTER DELIM TAG_SUBN
1737 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1739 if (xr == NULL) HANDLE_ERROR;
1740 $<ctxt>$ = start_record(REC_SUBN,
1741 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1742 NULL, GEDCOM_MAKE_NULL(val2));
1743 START(SUBN, $1, $<ctxt>$) }
1747 { end_record(REC_SUBN, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1750 subn_subs : /* empty */
1751 | subn_subs subn_sub
1754 subn_sub : subn_subm_sect { OCCUR2(SUBM, 0, 1) }
1755 | subn_famf_sect { OCCUR2(FAMF, 0, 1) }
1756 | subn_temp_sect { OCCUR2(TEMP, 0, 1) }
1757 | subn_ance_sect { OCCUR2(ANCE, 0, 1) }
1758 | subn_desc_sect { OCCUR2(DESC, 0, 1) }
1759 | subn_ordi_sect { OCCUR2(ORDI, 0, 1) }
1760 | subn_rin_sect { OCCUR2(RIN, 0, 1) }
1765 subn_subm_sect : OPEN DELIM TAG_SUBM mand_pointer
1766 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
1768 if (xr == NULL) HANDLE_ERROR;
1769 $<ctxt>$ = start_element(ELT_SUBN_SUBM,
1771 GEDCOM_MAKE_XREF_PTR(val1, xr));
1772 START(SUBM, $1, $<ctxt>$)
1777 { end_element(ELT_SUBN_SUBM, PARENT, $<ctxt>5,
1778 GEDCOM_MAKE_NULL(val1));
1783 subn_famf_sect : OPEN DELIM TAG_FAMF mand_line_item
1784 { $<ctxt>$ = start_element(ELT_SUBN_FAMF,
1786 GEDCOM_MAKE_STRING(val1, $4));
1787 START(FAMF, $1, $<ctxt>$)
1792 { end_element(ELT_SUBN_FAMF, PARENT, $<ctxt>5,
1793 GEDCOM_MAKE_NULL(val1));
1798 subn_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
1799 { $<ctxt>$ = start_element(ELT_SUBN_TEMP,
1801 GEDCOM_MAKE_STRING(val1, $4));
1802 START(TEMP, $1, $<ctxt>$)
1807 { end_element(ELT_SUBN_TEMP, PARENT, $<ctxt>5,
1808 GEDCOM_MAKE_NULL(val1));
1813 subn_ance_sect : OPEN DELIM TAG_ANCE mand_line_item
1814 { $<ctxt>$ = start_element(ELT_SUBN_ANCE,
1816 GEDCOM_MAKE_STRING(val1, $4));
1817 START(ANCE, $1, $<ctxt>$)
1822 { end_element(ELT_SUBN_ANCE, PARENT, $<ctxt>5,
1823 GEDCOM_MAKE_NULL(val1));
1828 subn_desc_sect : OPEN DELIM TAG_DESC mand_line_item
1829 { $<ctxt>$ = start_element(ELT_SUBN_DESC,
1831 GEDCOM_MAKE_STRING(val1, $4));
1832 START(DESC, $1, $<ctxt>$)
1837 { end_element(ELT_SUBN_DESC, PARENT, $<ctxt>5,
1838 GEDCOM_MAKE_NULL(val1));
1843 subn_ordi_sect : OPEN DELIM TAG_ORDI mand_line_item
1844 { $<ctxt>$ = start_element(ELT_SUBN_ORDI,
1846 GEDCOM_MAKE_STRING(val1, $4));
1847 START(ORDI, $1, $<ctxt>$)
1852 { end_element(ELT_SUBN_ORDI, PARENT, $<ctxt>5,
1853 GEDCOM_MAKE_NULL(val1));
1858 subn_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1859 { $<ctxt>$ = start_element(ELT_SUBN_RIN,
1861 GEDCOM_MAKE_STRING(val1, $4));
1862 START(RIN, $1, $<ctxt>$)
1867 { end_element(ELT_SUBN_RIN, PARENT, $<ctxt>5,
1868 GEDCOM_MAKE_NULL(val1));
1872 /*********************************************************************/
1873 /**** Submitter record ****/
1874 /*********************************************************************/
1875 submit_rec : OPEN DELIM POINTER DELIM TAG_SUBM
1876 { struct xref_value *xr = gedcom_parse_xref($3, XREF_DEFINED,
1878 if (xr == NULL) HANDLE_ERROR;
1879 $<ctxt>$ = start_record(REC_SUBM,
1880 $1, GEDCOM_MAKE_XREF_PTR(val1, xr), $5,
1881 NULL, GEDCOM_MAKE_NULL(val2));
1882 START(SUBM, $1, $<ctxt>$) }
1886 { end_record(REC_SUBM, $<ctxt>6, GEDCOM_MAKE_NULL(val1)); }
1889 subm_subs : /* empty */
1890 | subm_subs subm_sub
1893 subm_sub : subm_name_sect { OCCUR2(NAME, 1, 1) }
1894 | addr_struc_sub /* 0:1 */
1895 | multim_link_sub /* 0:M */
1896 | subm_lang_sect { OCCUR2(LANG, 0, 3) }
1897 | subm_rfn_sect { OCCUR2(RFN, 0, 1) }
1898 | subm_rin_sect { OCCUR2(RIN, 0, 1) }
1899 | change_date_sub /* 0:1 */
1904 subm_name_sect : OPEN DELIM TAG_NAME mand_line_item
1905 { $<ctxt>$ = start_element(ELT_SUBM_NAME,
1907 GEDCOM_MAKE_STRING(val1, $4));
1908 START(NAME, $1, $<ctxt>$)
1913 { end_element(ELT_SUBM_NAME, PARENT, $<ctxt>5,
1914 GEDCOM_MAKE_NULL(val1));
1919 subm_lang_sect : OPEN DELIM TAG_LANG mand_line_item
1920 { $<ctxt>$ = start_element(ELT_SUBM_LANG,
1922 GEDCOM_MAKE_STRING(val1, $4));
1923 START(LANG, $1, $<ctxt>$)
1928 { end_element(ELT_SUBM_LANG, PARENT, $<ctxt>5,
1929 GEDCOM_MAKE_NULL(val1));
1934 subm_rfn_sect : OPEN DELIM TAG_RFN mand_line_item
1935 { $<ctxt>$ = start_element(ELT_SUBM_RFN,
1937 GEDCOM_MAKE_STRING(val1, $4));
1938 START(RFN, $1, $<ctxt>$)
1943 { end_element(ELT_SUBM_RFN, PARENT, $<ctxt>5,
1944 GEDCOM_MAKE_NULL(val1));
1949 subm_rin_sect : OPEN DELIM TAG_RIN mand_line_item
1950 { $<ctxt>$ = start_element(ELT_SUBM_RIN,
1952 GEDCOM_MAKE_STRING(val1, $4));
1953 START(RIN, $1, $<ctxt>$)
1958 { end_element(ELT_SUBM_RIN, PARENT, $<ctxt>5,
1959 GEDCOM_MAKE_NULL(val1));
1963 /*********************************************************************/
1964 /**** Substructures ****/
1965 /*********************************************************************/
1967 /* ADDRESS STRUCTURE */
1968 addr_struc_sub : addr_sect { OCCUR2(ADDR, 0, 1) }
1969 | phon_sect { OCCUR2(PHON, 0, 3) }
1972 addr_sect : OPEN DELIM TAG_ADDR mand_line_item
1973 { $<ctxt>$ = start_element(ELT_SUB_ADDR,
1975 GEDCOM_MAKE_STRING(val1, $4));
1976 reset_buffer(&concat_buffer);
1977 safe_buf_append(&concat_buffer, $4);
1978 START(ADDR, $1, $<ctxt>$)
1983 { char* complete = get_buf_string(&concat_buffer);
1984 end_element(ELT_SUB_ADDR, PARENT, $<ctxt>5,
1985 GEDCOM_MAKE_STRING(val1, complete));
1989 addr_subs : /* empty */
1990 | addr_subs addr_sub
1993 addr_sub : addr_cont_sect /* 0:M */
1994 | addr_adr1_sect { OCCUR2(ADR1, 0, 1) }
1995 | addr_adr2_sect { OCCUR2(ADR2, 0, 1) }
1996 | addr_city_sect { OCCUR2(CITY, 0, 1) }
1997 | addr_stae_sect { OCCUR2(STAE, 0, 1) }
1998 | addr_post_sect { OCCUR2(POST, 0, 1) }
1999 | addr_ctry_sect { OCCUR2(CTRY, 0, 1) }
2003 addr_cont_sect : OPEN DELIM TAG_CONT mand_line_item
2004 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CONT,
2006 GEDCOM_MAKE_STRING(val1, $4));
2007 SAFE_BUF_ADDCHAR(&concat_buffer, '\n');
2008 safe_buf_append(&concat_buffer, $4);
2009 START(CONT, $1, $<ctxt>$)
2014 { end_element(ELT_SUB_ADDR_CONT, PARENT, $<ctxt>5,
2015 GEDCOM_MAKE_NULL(val1));
2018 addr_adr1_sect : OPEN DELIM TAG_ADR1 mand_line_item
2019 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR1,
2021 GEDCOM_MAKE_STRING(val1, $4));
2022 START(ADR1, $1, $<ctxt>$)
2027 { end_element(ELT_SUB_ADDR_ADR1, PARENT, $<ctxt>5,
2028 GEDCOM_MAKE_NULL(val1));
2031 addr_adr2_sect : OPEN DELIM TAG_ADR2 mand_line_item
2032 { $<ctxt>$ = start_element(ELT_SUB_ADDR_ADR2,
2034 GEDCOM_MAKE_STRING(val1, $4));
2035 START(ADR2, $1, $<ctxt>$)
2040 { end_element(ELT_SUB_ADDR_ADR2, PARENT, $<ctxt>5,
2041 GEDCOM_MAKE_NULL(val1));
2044 addr_city_sect : OPEN DELIM TAG_CITY mand_line_item
2045 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CITY,
2047 GEDCOM_MAKE_STRING(val1, $4));
2048 START(CITY, $1, $<ctxt>$)
2053 { end_element(ELT_SUB_ADDR_CITY, PARENT, $<ctxt>5,
2054 GEDCOM_MAKE_NULL(val1));
2057 addr_stae_sect : OPEN DELIM TAG_STAE mand_line_item
2058 { $<ctxt>$ = start_element(ELT_SUB_ADDR_STAE,
2060 GEDCOM_MAKE_STRING(val1, $4));
2061 START(STAE, $1, $<ctxt>$)
2066 { end_element(ELT_SUB_ADDR_STAE, PARENT, $<ctxt>5,
2067 GEDCOM_MAKE_NULL(val1));
2070 addr_post_sect : OPEN DELIM TAG_POST mand_line_item
2071 { $<ctxt>$ = start_element(ELT_SUB_ADDR_POST,
2073 GEDCOM_MAKE_STRING(val1, $4));
2074 START(POST, $1, $<ctxt>$)
2079 { end_element(ELT_SUB_ADDR_POST, PARENT, $<ctxt>5,
2080 GEDCOM_MAKE_NULL(val1));
2083 addr_ctry_sect : OPEN DELIM TAG_CTRY mand_line_item
2084 { $<ctxt>$ = start_element(ELT_SUB_ADDR_CTRY,
2086 GEDCOM_MAKE_STRING(val1, $4));
2087 START(CTRY, $1, $<ctxt>$)
2092 { end_element(ELT_SUB_ADDR_CTRY, PARENT, $<ctxt>5,
2093 GEDCOM_MAKE_NULL(val1));
2097 phon_sect : OPEN DELIM TAG_PHON mand_line_item
2098 { $<ctxt>$ = start_element(ELT_SUB_PHON,
2100 GEDCOM_MAKE_STRING(val1, $4));
2101 START(PHON, $1, $<ctxt>$)
2106 { end_element(ELT_SUB_PHON, PARENT, $<ctxt>5,
2107 GEDCOM_MAKE_NULL(val1));
2111 /* ASSOCIATION STRUCTURE */
2112 assoc_struc_sub : asso_sect /* 0:M */
2115 asso_sect : OPEN DELIM TAG_ASSO mand_pointer
2116 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2118 if (xr == NULL) HANDLE_ERROR;
2119 $<ctxt>$ = start_element(ELT_SUB_ASSO,
2121 GEDCOM_MAKE_XREF_PTR(val1, xr));
2122 START(ASSO, $1, $<ctxt>$)
2125 { CHECK2(TYPE,RELA) }
2127 { end_element(ELT_SUB_ASSO, PARENT, $<ctxt>5,
2128 GEDCOM_MAKE_NULL(val1));
2132 asso_subs : /* empty */
2133 | asso_type_sect { OCCUR2(TYPE, 1, 1) }
2134 | asso_rela_sect { OCCUR2(RELA, 1, 1) }
2140 asso_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2141 { $<ctxt>$ = start_element(ELT_SUB_ASSO_TYPE,
2143 GEDCOM_MAKE_STRING(val1, $4));
2144 START(TYPE, $1, $<ctxt>$)
2149 { end_element(ELT_SUB_ASSO_TYPE, PARENT, $<ctxt>5,
2150 GEDCOM_MAKE_NULL(val1));
2154 asso_rela_sect : OPEN DELIM TAG_RELA mand_line_item
2155 { $<ctxt>$ = start_element(ELT_SUB_ASSO_RELA,
2157 GEDCOM_MAKE_STRING(val1, $4));
2158 START(RELA, $1, $<ctxt>$)
2163 { end_element(ELT_SUB_ASSO_RELA, PARENT, $<ctxt>5,
2164 GEDCOM_MAKE_NULL(val1));
2169 change_date_sub : change_date_chan_sect { OCCUR2(CHAN, 0, 1) }
2172 change_date_chan_sect : OPEN DELIM TAG_CHAN
2173 { $<ctxt>$ = start_element(ELT_SUB_CHAN,
2174 PARENT, $1, $3, NULL,
2175 GEDCOM_MAKE_NULL(val1));
2176 START(CHAN, $1, $<ctxt>$)
2178 change_date_chan_subs
2181 { end_element(ELT_SUB_CHAN, PARENT, $<ctxt>4,
2182 GEDCOM_MAKE_NULL(val1));
2186 change_date_chan_subs : /* empty */
2187 | change_date_chan_subs change_date_chan_sub
2190 change_date_chan_sub : change_date_date_sect { OCCUR2(DATE, 1, 1) }
2195 change_date_date_sect : OPEN DELIM TAG_DATE mand_line_item
2196 { struct date_value dv = gedcom_parse_date($4);
2197 $<ctxt>$ = start_element(ELT_SUB_CHAN_DATE,
2199 GEDCOM_MAKE_DATE(val1, dv));
2200 START(DATE, $1, $<ctxt>$) }
2201 change_date_date_subs
2204 { end_element(ELT_SUB_CHAN_DATE, PARENT, $<ctxt>5,
2205 GEDCOM_MAKE_NULL(val1));
2209 change_date_date_subs : /* empty */
2210 | change_date_date_subs change_date_date_sub
2213 change_date_date_sub : change_date_date_time_sect { OCCUR2(TIME, 0, 1) }
2217 change_date_date_time_sect : OPEN DELIM TAG_TIME mand_line_item
2219 = start_element(ELT_SUB_CHAN_TIME,
2221 GEDCOM_MAKE_STRING(val1, $4));
2222 START(TIME, $1, $<ctxt>$)
2227 { end_element(ELT_SUB_CHAN_TIME, PARENT, $<ctxt>5,
2228 GEDCOM_MAKE_NULL(val1));
2232 /* CHILD TO FAMILY LINK */
2233 chi_fam_link_sub : famc_sect /* 0:M */
2236 famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2237 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2239 if (xr == NULL) HANDLE_ERROR;
2240 $<ctxt>$ = start_element(ELT_SUB_FAMC,
2242 GEDCOM_MAKE_XREF_PTR(val1, xr));
2243 START(FAMC, $1, $<ctxt>$)
2248 { end_element(ELT_SUB_FAMC, PARENT, $<ctxt>5,
2249 GEDCOM_MAKE_NULL(val1));
2253 famc_subs : /* empty */
2254 | famc_subs famc_sub
2257 famc_sub : famc_pedi_sect /* 0:M */
2262 famc_pedi_sect : OPEN DELIM TAG_PEDI mand_line_item
2263 { $<ctxt>$ = start_element(ELT_SUB_FAMC_PEDI,
2265 GEDCOM_MAKE_STRING(val1, $4));
2266 START(PEDI, $1, $<ctxt>$)
2271 { end_element(ELT_SUB_FAMC_PEDI, PARENT, $<ctxt>5,
2272 GEDCOM_MAKE_NULL(val1));
2276 /* CONTINUATION SUBSECTIONS */
2277 continuation_sub : cont_sect /* 0:M */
2278 | conc_sect /* 0:M */
2281 cont_sect : OPEN DELIM TAG_CONT mand_line_item
2282 { $<ctxt>$ = start_element(ELT_SUB_CONT,
2284 GEDCOM_MAKE_STRING(val1, $4));
2285 SAFE_BUF_ADDCHAR(&concat_buffer, '\n');
2286 safe_buf_append(&concat_buffer, $4);
2287 START(CONT, $1, $<ctxt>$)
2292 { end_element(ELT_SUB_CONT, PARENT, $<ctxt>5,
2293 GEDCOM_MAKE_NULL(val1));
2297 conc_sect : OPEN DELIM TAG_CONC mand_line_item
2298 { $<ctxt>$ = start_element(ELT_SUB_CONC,
2300 GEDCOM_MAKE_STRING(val1, $4));
2301 safe_buf_append(&concat_buffer, $4);
2302 START(CONC, $1, $<ctxt>$)
2307 { end_element(ELT_SUB_CONC, PARENT, $<ctxt>5,
2308 GEDCOM_MAKE_NULL(val1));
2313 event_detail_sub : event_detail_type_sect { OCCUR2(TYPE, 0, 1) }
2314 | event_detail_date_sect { OCCUR2(DATE, 0, 1) }
2317 | event_detail_age_sect { OCCUR2(AGE, 0, 1) }
2318 | event_detail_agnc_sect { OCCUR2(AGNC, 0, 1) }
2319 | event_detail_caus_sect { OCCUR2(CAUS, 0, 1) }
2325 event_detail_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2327 = start_element(ELT_SUB_EVT_TYPE,
2329 GEDCOM_MAKE_STRING(val1, $4));
2330 START(TYPE, $1, $<ctxt>$)
2335 { end_element(ELT_SUB_EVT_TYPE, PARENT, $<ctxt>5,
2336 GEDCOM_MAKE_NULL(val1));
2339 event_detail_date_sect : OPEN DELIM TAG_DATE mand_line_item
2340 { struct date_value dv = gedcom_parse_date($4);
2342 = start_element(ELT_SUB_EVT_DATE,
2344 GEDCOM_MAKE_DATE(val1, dv));
2345 START(DATE, $1, $<ctxt>$)
2350 { end_element(ELT_SUB_EVT_DATE, PARENT, $<ctxt>5,
2351 GEDCOM_MAKE_NULL(val1));
2354 event_detail_age_sect : OPEN DELIM TAG_AGE mand_line_item
2355 { struct age_value age = gedcom_parse_age($4);
2357 = start_element(ELT_SUB_EVT_AGE,
2359 GEDCOM_MAKE_AGE(val1, age));
2360 START(AGE, $1, $<ctxt>$)
2365 { end_element(ELT_SUB_EVT_AGE, PARENT, $<ctxt>5,
2366 GEDCOM_MAKE_NULL(val1));
2369 event_detail_agnc_sect : OPEN DELIM TAG_AGNC mand_line_item
2371 = start_element(ELT_SUB_EVT_AGNC,
2373 GEDCOM_MAKE_STRING(val1, $4));
2374 START(AGNC, $1, $<ctxt>$)
2379 { end_element(ELT_SUB_EVT_AGNC, PARENT, $<ctxt>5,
2380 GEDCOM_MAKE_NULL(val1));
2383 event_detail_caus_sect : OPEN DELIM TAG_CAUS mand_line_item
2385 = start_element(ELT_SUB_EVT_CAUS,
2387 GEDCOM_MAKE_STRING(val1, $4));
2388 START(CAUS, $1, $<ctxt>$)
2393 { end_element(ELT_SUB_EVT_CAUS, PARENT, $<ctxt>5,
2394 GEDCOM_MAKE_NULL(val1));
2398 /* FAMILY EVENT STRUCTURE */
2399 fam_event_struc_sub : fam_event_sect
2400 | fam_gen_even_sect /* 0:M */
2403 fam_event_sect : OPEN DELIM fam_event_tag opt_value
2405 = start_element(ELT_SUB_FAM_EVT,
2407 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2408 START2($1, $<ctxt>$);
2413 { end_element(ELT_SUB_FAM_EVT, PARENT, $<ctxt>5,
2414 GEDCOM_MAKE_NULL(val1));
2418 fam_event_tag : TAG_ANUL { $$ = $1; START1(ANUL) }
2419 | TAG_CENS { $$ = $1; START1(CENS) }
2420 | TAG_DIV { $$ = $1; START1(DIV) }
2421 | TAG_DIVF { $$ = $1; START1(DIVF) }
2422 | TAG_ENGA { $$ = $1; START1(ENGA) }
2423 | TAG_MARR { $$ = $1; START1(MARR) }
2424 | TAG_MARB { $$ = $1; START1(MARB) }
2425 | TAG_MARC { $$ = $1; START1(MARC) }
2426 | TAG_MARL { $$ = $1; START1(MARL) }
2427 | TAG_MARS { $$ = $1; START1(MARS) }
2430 fam_event_subs : /* empty */
2431 | fam_event_subs fam_event_sub
2434 fam_event_sub : event_detail_sub
2435 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2436 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2440 fam_even_husb_sect : OPEN DELIM TAG_HUSB
2441 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_HUSB,
2442 PARENT, $1, $3, NULL,
2443 GEDCOM_MAKE_NULL(val1));
2444 START(HUSB, $1, $<ctxt>$)
2449 { end_element(ELT_SUB_FAM_EVT_HUSB, PARENT, $<ctxt>4,
2450 GEDCOM_MAKE_NULL(val1));
2454 fam_even_husb_subs : /* empty */
2455 | fam_even_husb_subs fam_even_husb_sub
2458 fam_even_husb_sub : fam_even_age_sect { OCCUR2(AGE, 1, 1) }
2462 fam_even_age_sect : OPEN DELIM TAG_AGE mand_line_item
2463 { struct age_value age = gedcom_parse_age($4);
2464 $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_AGE,
2466 GEDCOM_MAKE_AGE(val1, age));
2467 START(AGE, $1, $<ctxt>$)
2472 { end_element(ELT_SUB_FAM_EVT_AGE, PARENT, $<ctxt>5,
2473 GEDCOM_MAKE_NULL(val1));
2477 fam_even_wife_sect : OPEN DELIM TAG_WIFE
2478 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_WIFE,
2479 PARENT, $1, $3, NULL,
2480 GEDCOM_MAKE_NULL(val1));
2481 START(WIFE, $1, $<ctxt>$)
2486 { end_element(ELT_SUB_FAM_EVT_WIFE, PARENT, $<ctxt>4,
2487 GEDCOM_MAKE_NULL(val1));
2491 fam_gen_even_sect : OPEN DELIM TAG_EVEN
2492 { $<ctxt>$ = start_element(ELT_SUB_FAM_EVT_EVEN,
2493 PARENT, $1, $3, NULL,
2494 GEDCOM_MAKE_NULL(val1));
2495 START(EVEN, $1, $<ctxt>$)
2500 { end_element(ELT_SUB_FAM_EVT_EVEN, PARENT, $<ctxt>4,
2501 GEDCOM_MAKE_NULL(val1));
2505 fam_gen_even_subs : /* empty */
2506 | fam_gen_even_subs fam_gen_even_sub
2509 fam_gen_even_sub : event_detail_sub
2510 | fam_even_husb_sect { OCCUR2(HUSB, 0, 1) }
2511 | fam_even_wife_sect { OCCUR2(WIFE, 0, 1) }
2515 /* IDENTIFICATION STRUCTURE */
2516 ident_struc_sub : ident_refn_sect /* 0:M */
2517 | ident_rin_sect { OCCUR2(RIN, 0, 1) }
2520 ident_refn_sect : OPEN DELIM TAG_REFN mand_line_item
2521 { $<ctxt>$ = start_element(ELT_SUB_IDENT_REFN,
2523 GEDCOM_MAKE_STRING(val1, $4));
2524 START(REFN, $1, $<ctxt>$)
2529 { end_element(ELT_SUB_IDENT_REFN, PARENT, $<ctxt>5,
2530 GEDCOM_MAKE_NULL(val1));
2534 ident_refn_subs : /* empty */
2535 | ident_refn_subs ident_refn_sub
2538 ident_refn_sub : ident_refn_type_sect { OCCUR2(TYPE, 0, 1) }
2542 ident_refn_type_sect : OPEN DELIM TAG_TYPE mand_line_item
2544 = start_element(ELT_SUB_IDENT_REFN_TYPE,
2546 GEDCOM_MAKE_STRING(val1, $4));
2547 START(TYPE, $1, $<ctxt>$)
2552 { end_element(ELT_SUB_IDENT_REFN_TYPE, PARENT, $<ctxt>5,
2553 GEDCOM_MAKE_NULL(val1));
2557 ident_rin_sect : OPEN DELIM TAG_RIN mand_line_item
2558 { $<ctxt>$ = start_element(ELT_SUB_IDENT_RIN,
2560 GEDCOM_MAKE_STRING(val1, $4));
2561 START(RIN, $1, $<ctxt>$)
2566 { end_element(ELT_SUB_IDENT_RIN, PARENT, $<ctxt>5,
2567 GEDCOM_MAKE_NULL(val1));
2571 /* INDIVIDUAL ATTRIBUTE STRUCTURE */
2572 indiv_attr_struc_sub : indiv_attr_sect /* 0:M */
2573 | indiv_resi_sect /* 0:M */
2576 indiv_attr_sect : OPEN DELIM indiv_attr_tag mand_line_item
2577 { $<ctxt>$ = start_element(ELT_SUB_INDIV_ATTR,
2579 GEDCOM_MAKE_STRING(val1, $4));
2580 START2($1, $<ctxt>$);
2582 indiv_attr_event_subs
2585 { end_element(ELT_SUB_INDIV_ATTR, PARENT, $<ctxt>5,
2586 GEDCOM_MAKE_NULL(val1));
2590 indiv_attr_tag : TAG_CAST { $$ = $1; START1(CAST) }
2591 | TAG_DSCR { $$ = $1; START1(DSCR) }
2592 | TAG_EDUC { $$ = $1; START1(EDUC) }
2593 | TAG_IDNO { $$ = $1; START1(IDNO) }
2594 | TAG_NATI { $$ = $1; START1(NATI) }
2595 | TAG_NCHI { $$ = $1; START1(NCHI) }
2596 | TAG_NMR { $$ = $1; START1(NMR) }
2597 | TAG_OCCU { $$ = $1; START1(OCCU) }
2598 | TAG_PROP { $$ = $1; START1(PROP) }
2599 | TAG_RELI { $$ = $1; START1(RELI) }
2600 | TAG_SSN { $$ = $1; START1(SSN) }
2601 | TAG_TITL { $$ = $1; START1(TITL) }
2604 indiv_resi_sect : OPEN DELIM TAG_RESI
2605 { $<ctxt>$ = start_element(ELT_SUB_INDIV_RESI,
2606 PARENT, $1, $3, NULL,
2607 GEDCOM_MAKE_NULL(val1));
2608 START(RESI, $1, $<ctxt>$)
2610 indiv_attr_event_subs
2613 { end_element(ELT_SUB_INDIV_RESI, PARENT, $<ctxt>4,
2614 GEDCOM_MAKE_NULL(val1));
2618 indiv_attr_event_subs : /* empty */
2619 | indiv_attr_event_subs indiv_attr_event_sub
2622 indiv_attr_event_sub : event_detail_sub
2626 /* INDIVIDUAL EVENT STRUCTURE */
2627 indiv_even_struc_sub : indiv_birt_sect
2629 | indiv_adop_sect /* 0:M */
2630 | indiv_even_sect /* 0:M */
2633 indiv_birt_sect : OPEN DELIM indiv_birt_tag opt_value
2635 = start_element(ELT_SUB_INDIV_BIRT,
2637 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2638 START2($1, $<ctxt>$);
2643 { end_element(ELT_SUB_INDIV_BIRT, PARENT, $<ctxt>5,
2644 GEDCOM_MAKE_NULL(val1));
2648 indiv_birt_tag : TAG_BIRT { $$ = $1; START1(BIRT) }
2649 | TAG_CHR { $$ = $1; START1(CHR) }
2652 indiv_birt_subs : /* empty */
2653 | indiv_birt_subs indiv_birt_sub
2656 indiv_birt_sub : event_detail_sub
2657 | indiv_birt_famc_sect { OCCUR2(FAMC,0, 1) }
2661 indiv_birt_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2662 { struct xref_value *xr = gedcom_parse_xref($4,
2665 if (xr == NULL) HANDLE_ERROR;
2667 = start_element(ELT_SUB_INDIV_BIRT_FAMC,
2669 GEDCOM_MAKE_XREF_PTR(val1, xr));
2670 START(FAMC, $1, $<ctxt>$)
2675 { end_element(ELT_SUB_INDIV_BIRT_FAMC, PARENT, $<ctxt>5,
2676 GEDCOM_MAKE_NULL(val1));
2680 indiv_gen_sect : OPEN DELIM indiv_gen_tag opt_value
2682 = start_element(ELT_SUB_INDIV_GEN,
2684 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2685 START2($1, $<ctxt>$);
2690 { end_element(ELT_SUB_INDIV_GEN, PARENT, $<ctxt>5,
2691 GEDCOM_MAKE_NULL(val1));
2695 indiv_gen_tag : TAG_DEAT { $$ = $1; START1(DEAT) }
2696 | TAG_BURI { $$ = $1; START1(BURI) }
2697 | TAG_CREM { $$ = $1; START1(CREM) }
2698 | TAG_BAPM { $$ = $1; START1(BAPM) }
2699 | TAG_BARM { $$ = $1; START1(BARM) }
2700 | TAG_BASM { $$ = $1; START1(BASM) }
2701 | TAG_BLES { $$ = $1; START1(BLES) }
2702 | TAG_CHRA { $$ = $1; START1(CHRA) }
2703 | TAG_CONF { $$ = $1; START1(CONF) }
2704 | TAG_FCOM { $$ = $1; START1(FCOM) }
2705 | TAG_ORDN { $$ = $1; START1(ORDN) }
2706 | TAG_NATU { $$ = $1; START1(NATU) }
2707 | TAG_EMIG { $$ = $1; START1(EMIG) }
2708 | TAG_IMMI { $$ = $1; START1(IMMI) }
2709 | TAG_CENS { $$ = $1; START1(CENS) }
2710 | TAG_PROB { $$ = $1; START1(PROB) }
2711 | TAG_WILL { $$ = $1; START1(WILL) }
2712 | TAG_GRAD { $$ = $1; START1(GRAD) }
2713 | TAG_RETI { $$ = $1; START1(RETI) }
2716 indiv_gen_subs : /* empty */
2717 | indiv_gen_subs indiv_gen_sub
2720 indiv_gen_sub : event_detail_sub
2724 indiv_adop_sect : OPEN DELIM TAG_ADOP opt_value
2726 = start_element(ELT_SUB_INDIV_ADOP,
2728 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
2729 START(ADOP, $1, $<ctxt>$) }
2733 { end_element(ELT_SUB_INDIV_ADOP, PARENT, $<ctxt>5,
2734 GEDCOM_MAKE_NULL(val1));
2738 indiv_adop_subs : /* empty */
2739 | indiv_adop_subs indiv_adop_sub
2742 indiv_adop_sub : event_detail_sub
2743 | indiv_adop_famc_sect { OCCUR2(FAMC,0, 1) }
2747 indiv_adop_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2748 { struct xref_value *xr = gedcom_parse_xref($4,
2751 if (xr == NULL) HANDLE_ERROR;
2753 = start_element(ELT_SUB_INDIV_ADOP_FAMC,
2755 GEDCOM_MAKE_XREF_PTR(val1, xr));
2756 START(FAMC, $1, $<ctxt>$) }
2757 indiv_adop_famc_subs
2760 { end_element(ELT_SUB_INDIV_ADOP_FAMC, PARENT, $<ctxt>5,
2761 GEDCOM_MAKE_NULL(val1));
2765 indiv_adop_famc_subs : /* empty */
2766 | indiv_adop_famc_subs indiv_adop_famc_sub
2769 indiv_adop_famc_sub : indiv_adop_famc_adop_sect { OCCUR2(ADOP,0, 1) }
2773 indiv_adop_famc_adop_sect : OPEN DELIM TAG_ADOP mand_line_item
2775 = start_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2777 GEDCOM_MAKE_STRING(val1, $4));
2778 START(ADOP, $1, $<ctxt>$) }
2782 { end_element(ELT_SUB_INDIV_ADOP_FAMC_ADOP,
2784 GEDCOM_MAKE_NULL(val1));
2788 indiv_even_sect : OPEN DELIM TAG_EVEN
2789 { $<ctxt>$ = start_element(ELT_SUB_INDIV_EVEN,
2790 PARENT, $1, $3, NULL,
2791 GEDCOM_MAKE_NULL(val1));
2792 START(EVEN, $1, $<ctxt>$) }
2796 { end_element(ELT_SUB_INDIV_EVEN, PARENT, $<ctxt>4,
2797 GEDCOM_MAKE_NULL(val1));
2801 /* LDS INDIVIDUAL ORDINANCE */
2802 lds_indiv_ord_sub : lio_bapl_sect /* 0:M */
2803 | lio_slgc_sect /* 0:M */
2806 lio_bapl_sect : OPEN DELIM lio_bapl_tag
2807 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL,
2808 PARENT, $1, $3, NULL,
2809 GEDCOM_MAKE_NULL(val1));
2810 START2($1, $<ctxt>$);
2815 { end_element(ELT_SUB_LIO_BAPL, PARENT, $<ctxt>4,
2816 GEDCOM_MAKE_NULL(val1));
2820 lio_bapl_tag : TAG_BAPL { $$ = $1; START1(BAPL) }
2821 | TAG_CONL { $$ = $1; START1(CONL) }
2822 | TAG_ENDL { $$ = $1; START1(ENDL) }
2825 lio_bapl_subs : /* empty */
2826 | lio_bapl_subs lio_bapl_sub
2829 lio_bapl_sub : lio_bapl_stat_sect { OCCUR2(STAT, 0, 1) }
2830 | lio_bapl_date_sect { OCCUR2(DATE, 0, 1) }
2831 | lio_bapl_temp_sect { OCCUR2(TEMP, 0, 1) }
2832 | lio_bapl_plac_sect { OCCUR2(PLAC, 0, 1) }
2838 lio_bapl_stat_sect : OPEN DELIM TAG_STAT mand_line_item
2839 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_STAT,
2841 GEDCOM_MAKE_STRING(val1, $4));
2842 START(STAT, $1, $<ctxt>$)
2847 { end_element(ELT_SUB_LIO_BAPL_STAT, PARENT, $<ctxt>5,
2848 GEDCOM_MAKE_NULL(val1));
2851 lio_bapl_date_sect : OPEN DELIM TAG_DATE mand_line_item
2852 { struct date_value dv = gedcom_parse_date($4);
2853 $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_DATE,
2855 GEDCOM_MAKE_DATE(val1, dv));
2856 START(DATE, $1, $<ctxt>$)
2861 { end_element(ELT_SUB_LIO_BAPL_DATE, PARENT, $<ctxt>5,
2862 GEDCOM_MAKE_NULL(val1));
2865 lio_bapl_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
2866 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_TEMP,
2868 GEDCOM_MAKE_STRING(val1, $4));
2869 START(TEMP, $1, $<ctxt>$)
2874 { end_element(ELT_SUB_LIO_BAPL_TEMP, PARENT, $<ctxt>5,
2875 GEDCOM_MAKE_NULL(val1));
2878 lio_bapl_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
2879 { $<ctxt>$ = start_element(ELT_SUB_LIO_BAPL_PLAC,
2881 GEDCOM_MAKE_STRING(val1, $4));
2882 START(PLAC, $1, $<ctxt>$)
2887 { end_element(ELT_SUB_LIO_BAPL_PLAC, PARENT, $<ctxt>5,
2888 GEDCOM_MAKE_NULL(val1));
2892 lio_slgc_sect : OPEN DELIM TAG_SLGC
2893 { $<ctxt>$ = start_element(ELT_SUB_LIO_SLGC,
2894 PARENT, $1, $3, NULL,
2895 GEDCOM_MAKE_NULL(val1));
2896 START(SLGC, $1, $<ctxt>$)
2899 { if (compat_mode(C_NO_SLGC_FAMC) && ! CHK_COND(FAMC))
2900 compat_generate_slgc_famc_link($<ctxt>4);
2905 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4,
2906 GEDCOM_MAKE_NULL(val1));
2910 lio_slgc_subs : /* empty */
2911 | lio_slgc_subs lio_slgc_sub
2914 lio_slgc_sub : lio_bapl_sub
2915 | lio_slgc_famc_sect { OCCUR2(FAMC, 1, 1) }
2918 lio_slgc_famc_sect : OPEN DELIM TAG_FAMC mand_pointer
2919 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
2921 if (xr == NULL) HANDLE_ERROR;
2923 = start_element(ELT_SUB_LIO_SLGC_FAMC,
2925 GEDCOM_MAKE_XREF_PTR(val1, xr));
2926 START(FAMC, $1, $<ctxt>$)
2931 { end_element(ELT_SUB_LIO_SLGC_FAMC, PARENT, $<ctxt>5,
2932 GEDCOM_MAKE_NULL(val1));
2936 /* LDS SPOUSE SEALING */
2937 lds_spouse_seal_sub : lss_slgs_sect
2940 lss_slgs_sect : OPEN DELIM TAG_SLGS
2941 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS,
2942 PARENT, $1, $3, NULL,
2943 GEDCOM_MAKE_NULL(val1));
2944 START(SLGS, $1, $<ctxt>$) }
2948 { end_element(ELT_SUB_LIO_SLGC, PARENT, $<ctxt>4,
2949 GEDCOM_MAKE_NULL(val1));
2953 lss_slgs_subs : /* empty */
2954 | lss_slgs_subs lss_slgs_sub
2957 lss_slgs_sub : lss_slgs_stat_sect { OCCUR2(STAT, 0, 1) }
2958 | lss_slgs_date_sect { OCCUR2(DATE, 0, 1) }
2959 | lss_slgs_temp_sect { OCCUR2(TEMP, 0, 1) }
2960 | lss_slgs_plac_sect { OCCUR2(PLAC, 0, 1) }
2966 lss_slgs_stat_sect : OPEN DELIM TAG_STAT mand_line_item
2967 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_STAT,
2969 GEDCOM_MAKE_STRING(val1, $4));
2970 START(STAT, $1, $<ctxt>$)
2975 { end_element(ELT_SUB_LSS_SLGS_STAT, PARENT, $<ctxt>5,
2976 GEDCOM_MAKE_NULL(val1));
2979 lss_slgs_date_sect : OPEN DELIM TAG_DATE mand_line_item
2980 { struct date_value dv = gedcom_parse_date($4);
2981 $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_DATE,
2983 GEDCOM_MAKE_DATE(val1, dv));
2984 START(DATE, $1, $<ctxt>$)
2989 { end_element(ELT_SUB_LSS_SLGS_DATE, PARENT, $<ctxt>5,
2990 GEDCOM_MAKE_NULL(val1));
2993 lss_slgs_temp_sect : OPEN DELIM TAG_TEMP mand_line_item
2994 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_TEMP,
2996 GEDCOM_MAKE_STRING(val1, $4));
2997 START(TEMP, $1, $<ctxt>$)
3002 { end_element(ELT_SUB_LSS_SLGS_TEMP, PARENT, $<ctxt>5,
3003 GEDCOM_MAKE_NULL(val1));
3006 lss_slgs_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
3007 { $<ctxt>$ = start_element(ELT_SUB_LSS_SLGS_PLAC,
3009 GEDCOM_MAKE_STRING(val1, $4));
3010 START(PLAC, $1, $<ctxt>$)
3015 { end_element(ELT_SUB_LSS_SLGS_PLAC, PARENT, $<ctxt>5,
3016 GEDCOM_MAKE_NULL(val1));
3020 /* MULTIMEDIA LINK */
3021 multim_link_sub : multim_obje_link_sect
3022 | multim_obje_emb_sect
3025 multim_obje_link_sect : OPEN DELIM TAG_OBJE DELIM POINTER
3026 { struct xref_value *xr = gedcom_parse_xref($5,
3029 if (xr == NULL) HANDLE_ERROR;
3031 = start_element(ELT_SUB_MULTIM_OBJE,
3033 GEDCOM_MAKE_XREF_PTR(val1, xr));
3034 START(OBJE, $1, $<ctxt>$)
3039 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>6,
3040 GEDCOM_MAKE_NULL(val1));
3044 multim_obje_emb_sect : OPEN DELIM TAG_OBJE
3045 { $<ctxt>$ = start_element(ELT_SUB_MULTIM_OBJE,
3046 PARENT, $1, $3, NULL,
3047 GEDCOM_MAKE_NULL(val1));
3048 START(OBJE, $1, $<ctxt>$)
3050 multim_obje_emb_subs
3051 { CHECK2(FORM,FILE) }
3053 { end_element(ELT_SUB_MULTIM_OBJE, PARENT, $<ctxt>4,
3054 GEDCOM_MAKE_NULL(val1));
3058 multim_obje_emb_subs : /* empty */
3059 | multim_obje_emb_subs multim_obje_emb_sub
3062 multim_obje_emb_sub : multim_obje_form_sect { OCCUR2(FORM, 1, 1) }
3063 | multim_obje_titl_sect { OCCUR2(TITL, 0, 1) }
3064 | multim_obje_file_sect { OCCUR2(FILE, 1, 1) }
3069 multim_obje_form_sect : OPEN DELIM TAG_FORM mand_line_item
3071 = start_element(ELT_SUB_MULTIM_OBJE_FORM,
3073 GEDCOM_MAKE_STRING(val1, $4));
3074 START(FORM, $1, $<ctxt>$)
3079 { end_element(ELT_SUB_MULTIM_OBJE_FORM,
3081 GEDCOM_MAKE_NULL(val1));
3084 multim_obje_titl_sect : OPEN DELIM TAG_TITL mand_line_item
3086 = start_element(ELT_SUB_MULTIM_OBJE_TITL,
3088 GEDCOM_MAKE_STRING(val1, $4));
3089 START(TITL, $1, $<ctxt>$)
3094 { end_element(ELT_SUB_MULTIM_OBJE_TITL,
3096 GEDCOM_MAKE_NULL(val1));
3099 multim_obje_file_sect : OPEN DELIM TAG_FILE mand_line_item
3101 = start_element(ELT_SUB_MULTIM_OBJE_FILE,
3103 GEDCOM_MAKE_STRING(val1, $4));
3104 START(FILE, $1, $<ctxt>$)
3109 { end_element(ELT_SUB_MULTIM_OBJE_FILE,
3111 GEDCOM_MAKE_NULL(val1));
3115 /* NOTE STRUCTURE */
3116 note_struc_sub : note_struc_link_sect /* 0:M */
3117 | note_struc_emb_sect /* 0:M */
3120 note_struc_link_sect : OPEN DELIM TAG_NOTE DELIM POINTER
3121 { struct xref_value *xr = gedcom_parse_xref($5,
3124 if (xr == NULL) HANDLE_ERROR;
3126 = start_element(ELT_SUB_NOTE,
3128 GEDCOM_MAKE_XREF_PTR(val1, xr));
3129 START(NOTE, $1, $<ctxt>$)
3131 note_struc_link_subs
3134 { end_element(ELT_SUB_NOTE, PARENT, $<ctxt>6,
3135 GEDCOM_MAKE_NULL(val1));
3139 note_struc_link_subs : /* empty */
3140 | note_struc_link_subs note_struc_link_sub
3143 note_struc_link_sub : source_cit_sub
3147 note_struc_emb_sect : OPEN DELIM TAG_NOTE opt_line_item
3149 = start_element(ELT_SUB_NOTE,
3151 GEDCOM_MAKE_NULL_OR_STRING(val1, $4));
3152 reset_buffer(&concat_buffer);
3154 safe_buf_append(&concat_buffer, $4);
3155 START(NOTE, $1, $<ctxt>$)
3160 { char* complete = get_buf_string(&concat_buffer);
3161 end_element(ELT_SUB_NOTE, PARENT, $<ctxt>5,
3162 GEDCOM_MAKE_STRING(val1, complete));
3166 note_struc_emb_subs : /* empty */
3167 | note_struc_emb_subs note_struc_emb_sub
3170 note_struc_emb_sub : continuation_sub
3175 /* PERSONAL NAME STRUCTURE */
3176 pers_name_struc_sub : pers_name_sect /* 0:M */
3179 pers_name_sect : OPEN DELIM TAG_NAME mand_line_item
3180 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME,
3182 GEDCOM_MAKE_STRING(val1, $4));
3183 START(NAME, $1, $<ctxt>$)
3188 { end_element(ELT_SUB_PERS_NAME, PARENT, $<ctxt>5,
3189 GEDCOM_MAKE_NULL(val1));
3193 pers_name_subs : /* empty */
3194 | pers_name_subs pers_name_sub
3197 pers_name_sub : pers_name_npfx_sect { OCCUR2(NPFX, 0, 1) }
3198 | pers_name_givn_sect { OCCUR2(GIVN, 0, 1) }
3199 | pers_name_nick_sect { OCCUR2(NICK, 0, 1) }
3200 | pers_name_spfx_sect { OCCUR2(SPFX, 0, 1) }
3201 | pers_name_surn_sect { OCCUR2(SURN, 0, 1) }
3202 | pers_name_nsfx_sect { OCCUR2(NSFX, 0, 1) }
3208 pers_name_npfx_sect : OPEN DELIM TAG_NPFX mand_line_item
3209 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NPFX,
3211 GEDCOM_MAKE_STRING(val1, $4));
3212 START(NPFX, $1, $<ctxt>$)
3217 { end_element(ELT_SUB_PERS_NAME_NPFX, PARENT, $<ctxt>5,
3218 GEDCOM_MAKE_NULL(val1));
3221 pers_name_givn_sect : OPEN DELIM TAG_GIVN mand_line_item
3222 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_GIVN,
3224 GEDCOM_MAKE_STRING(val1, $4));
3225 START(GIVN, $1, $<ctxt>$)
3230 { end_element(ELT_SUB_PERS_NAME_GIVN, PARENT, $<ctxt>5,
3231 GEDCOM_MAKE_NULL(val1));
3234 pers_name_nick_sect : OPEN DELIM TAG_NICK mand_line_item
3235 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NICK,
3237 GEDCOM_MAKE_STRING(val1, $4));
3238 START(NICK, $1, $<ctxt>$)
3243 { end_element(ELT_SUB_PERS_NAME_NICK, PARENT, $<ctxt>5,
3244 GEDCOM_MAKE_NULL(val1));
3247 pers_name_spfx_sect : OPEN DELIM TAG_SPFX mand_line_item
3248 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SPFX,
3250 GEDCOM_MAKE_STRING(val1, $4));
3251 START(SPFX, $1, $<ctxt>$)
3256 { end_element(ELT_SUB_PERS_NAME_SPFX, PARENT, $<ctxt>5,
3257 GEDCOM_MAKE_NULL(val1));
3260 pers_name_surn_sect : OPEN DELIM TAG_SURN mand_line_item
3261 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_SURN,
3263 GEDCOM_MAKE_STRING(val1, $4));
3264 START(SURN, $1, $<ctxt>$)
3269 { end_element(ELT_SUB_PERS_NAME_SURN, PARENT, $<ctxt>5,
3270 GEDCOM_MAKE_NULL(val1));
3273 pers_name_nsfx_sect : OPEN DELIM TAG_NSFX mand_line_item
3274 { $<ctxt>$ = start_element(ELT_SUB_PERS_NAME_NSFX,
3276 GEDCOM_MAKE_STRING(val1, $4));
3277 START(NSFX, $1, $<ctxt>$)
3282 { end_element(ELT_SUB_PERS_NAME_NSFX, PARENT, $<ctxt>5,
3283 GEDCOM_MAKE_NULL(val1));
3287 /* PLACE STRUCTURE */
3288 place_struc_sub : place_struc_plac_sect /* 0:M */
3291 place_struc_plac_sect : OPEN DELIM TAG_PLAC mand_line_item
3293 = start_element(ELT_SUB_PLAC,
3295 GEDCOM_MAKE_STRING(val1, $4));
3296 START(PLAC, $1, $<ctxt>$)
3298 place_struc_plac_subs
3301 { end_element(ELT_SUB_PLAC, PARENT, $<ctxt>5,
3302 GEDCOM_MAKE_NULL(val1));
3306 place_struc_plac_subs : /* empty */
3307 | place_struc_plac_subs place_struc_plac_sub
3310 place_struc_plac_sub : place_plac_form_sect { OCCUR2(FORM, 0, 1) }
3316 place_plac_form_sect : OPEN DELIM TAG_FORM mand_line_item
3318 = start_element(ELT_SUB_PLAC_FORM,
3320 GEDCOM_MAKE_STRING(val1, $4));
3321 START(FORM, $1, $<ctxt>$)
3326 { end_element(ELT_SUB_PLAC_FORM, PARENT, $<ctxt>5,
3327 GEDCOM_MAKE_NULL(val1));
3331 /* SOURCE_CITATION */
3332 source_cit_sub : source_cit_link_sect /* 0:M */
3333 | source_cit_emb_sect /* 0:M */
3336 source_cit_link_sect : OPEN DELIM TAG_SOUR DELIM POINTER
3337 { struct xref_value *xr = gedcom_parse_xref($5,
3340 if (xr == NULL) HANDLE_ERROR;
3342 = start_element(ELT_SUB_SOUR,
3344 GEDCOM_MAKE_XREF_PTR(val1, xr));
3345 START(SOUR, $1, $<ctxt>$)
3347 source_cit_link_subs
3350 { end_element(ELT_SUB_SOUR, PARENT, $<ctxt>6,
3351 GEDCOM_MAKE_NULL(val1));
3355 source_cit_link_subs : /* empty */
3356 | source_cit_link_subs source_cit_link_sub
3359 source_cit_link_sub : source_cit_page_sect { OCCUR2(PAGE, 0, 1) }
3360 | source_cit_even_sect { OCCUR2(EVEN, 0, 1) }
3361 | source_cit_data_sect { OCCUR2(DATA, 0, 1) }
3362 | source_cit_quay_sect { OCCUR2(QUAY, 0, 1) }
3368 source_cit_page_sect : OPEN DELIM TAG_PAGE mand_line_item
3370 = start_element(ELT_SUB_SOUR_PAGE,
3372 GEDCOM_MAKE_STRING(val1, $4));
3373 START(PAGE, $1, $<ctxt>$)
3378 { end_element(ELT_SUB_SOUR_PAGE, PARENT, $<ctxt>5,
3379 GEDCOM_MAKE_NULL(val1));
3383 source_cit_even_sect : OPEN DELIM TAG_EVEN mand_line_item
3385 = start_element(ELT_SUB_SOUR_EVEN,
3387 GEDCOM_MAKE_STRING(val1, $4));
3388 START(EVEN, $1, $<ctxt>$)
3390 source_cit_even_subs
3393 { end_element(ELT_SUB_SOUR_EVEN, PARENT, $<ctxt>5,
3394 GEDCOM_MAKE_NULL(val1));
3398 source_cit_even_subs : /* empty */
3399 | source_cit_even_subs source_cit_even_sub
3402 source_cit_even_sub : source_cit_even_role_sect { OCCUR2(ROLE, 0, 1) }
3406 source_cit_even_role_sect : OPEN DELIM TAG_ROLE mand_line_item
3408 = start_element(ELT_SUB_SOUR_EVEN_ROLE,
3410 GEDCOM_MAKE_STRING(val1, $4));
3411 START(ROLE, $1, $<ctxt>$)
3416 { end_element(ELT_SUB_SOUR_EVEN_ROLE,
3418 GEDCOM_MAKE_NULL(val1));
3422 source_cit_data_sect : OPEN DELIM TAG_DATA
3423 { $<ctxt>$ = start_element(ELT_SUB_SOUR_DATA,
3424 PARENT, $1, $3, NULL,
3425 GEDCOM_MAKE_NULL(val1));
3426 START(DATA, $1, $<ctxt>$)
3428 source_cit_data_subs
3431 { end_element(ELT_SUB_SOUR_DATA, PARENT, $<ctxt>4,
3432 GEDCOM_MAKE_NULL(val1));
3436 source_cit_data_subs : /* empty */
3437 | source_cit_data_subs source_cit_data_sub
3440 source_cit_data_sub : source_cit_data_date_sect { OCCUR2(DATE, 0, 1) }
3441 | source_cit_text_sect /* 0:M */
3445 source_cit_data_date_sect : OPEN DELIM TAG_DATE mand_line_item
3446 { struct date_value dv = gedcom_parse_date($4);
3448 = start_element(ELT_SUB_SOUR_DATA_DATE,
3450 GEDCOM_MAKE_DATE(val1, dv));
3451 START(DATE, $1, $<ctxt>$)
3456 { end_element(ELT_SUB_SOUR_DATA_DATE,
3458 GEDCOM_MAKE_NULL(val1));
3462 source_cit_text_sect : OPEN DELIM TAG_TEXT mand_line_item
3464 = start_element(ELT_SUB_SOUR_TEXT,
3466 GEDCOM_MAKE_STRING(val1, $4));
3467 reset_buffer(&concat_buffer);
3468 safe_buf_append(&concat_buffer, $4);
3469 START(TEXT, $1, $<ctxt>$)
3471 source_cit_text_subs
3474 { char* complete = get_buf_string(&concat_buffer);
3475 end_element(ELT_SUB_SOUR_TEXT, PARENT, $<ctxt>5,
3476 GEDCOM_MAKE_STRING(val1, complete));
3480 source_cit_text_subs : /* empty */
3481 | source_cit_text_subs source_cit_text_sub
3484 source_cit_text_sub : continuation_sub
3488 source_cit_quay_sect : OPEN DELIM TAG_QUAY mand_line_item
3490 = start_element(ELT_SUB_SOUR_QUAY,
3492 GEDCOM_MAKE_STRING(val1, $4));
3493 START(QUAY, $1, $<ctxt>$)
3498 { end_element(ELT_SUB_SOUR_QUAY, PARENT, $<ctxt>5,
3499 GEDCOM_MAKE_NULL(val1));
3503 source_cit_emb_sect : OPEN DELIM TAG_SOUR mand_line_item
3504 { $<ctxt>$ = start_element(ELT_SUB_SOUR,
3506 GEDCOM_MAKE_STRING(val1, $4));
3507 reset_buffer(&concat_buffer);
3508 safe_buf_append(&concat_buffer, $4);
3509 START(SOUR, $1, $<ctxt>$)
3514 { char* complete = get_buf_string(&concat_buffer);
3515 end_element(ELT_SUB_SOUR, PARENT, $<ctxt>5,
3516 GEDCOM_MAKE_STRING(val1, complete));
3520 source_cit_emb_subs : /* empty */
3521 | source_cit_emb_subs source_cit_emb_sub
3524 source_cit_emb_sub : continuation_sub
3525 | source_cit_text_sect /* 0:M */
3530 /* SOURCE REPOSITORY CITATION */
3531 source_repos_cit_sub : source_repos_repo_sect { OCCUR2(REPO, 0, 1) }
3534 source_repos_repo_sect : OPEN DELIM TAG_REPO mand_pointer
3535 { struct xref_value *xr
3536 = gedcom_parse_xref($4, XREF_USED, XREF_REPO);
3537 if (xr == NULL) HANDLE_ERROR;
3539 = start_element(ELT_SUB_REPO,
3541 GEDCOM_MAKE_XREF_PTR(val1, xr));
3542 START(REPO, $1, $<ctxt>$)
3544 source_repos_repo_subs
3547 { end_element(ELT_SUB_REPO, PARENT, $<ctxt>5,
3548 GEDCOM_MAKE_NULL(val1));
3552 source_repos_repo_subs : /* empty */
3553 | source_repos_repo_subs source_repos_repo_sub
3556 source_repos_repo_sub : note_struc_sub
3557 | caln_sect /* 0:M */
3561 caln_sect : OPEN DELIM TAG_CALN mand_line_item
3562 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN,
3564 GEDCOM_MAKE_STRING(val1, $4));
3565 START(CALN, $1, $<ctxt>$)
3570 { end_element(ELT_SUB_REPO_CALN, PARENT, $<ctxt>5,
3571 GEDCOM_MAKE_NULL(val1));
3575 caln_subs : /* empty */
3576 | caln_subs caln_sub
3579 caln_sub : caln_medi_sect { OCCUR2(MEDI, 0, 1) }
3583 caln_medi_sect : OPEN DELIM TAG_MEDI mand_line_item
3584 { $<ctxt>$ = start_element(ELT_SUB_REPO_CALN_MEDI,
3586 GEDCOM_MAKE_STRING(val1, $4));
3587 START(MEDI, $1, $<ctxt>$)
3592 { end_element(ELT_SUB_REPO_CALN_MEDI, PARENT, $<ctxt>5,
3593 GEDCOM_MAKE_NULL(val1));
3597 /* SPOUSE TO FAMILY LINK */
3598 spou_fam_link_sub : spou_fam_fams_sect /* 0:M */
3601 spou_fam_fams_sect : OPEN DELIM TAG_FAMS mand_pointer
3602 { struct xref_value *xr = gedcom_parse_xref($4, XREF_USED,
3604 if (xr == NULL) HANDLE_ERROR;
3606 = start_element(ELT_SUB_FAMS,
3608 GEDCOM_MAKE_XREF_PTR(val1, xr));
3609 START(FAMS, $1, $<ctxt>$)
3614 { end_element(ELT_SUB_FAMS, PARENT, $<ctxt>5,
3615 GEDCOM_MAKE_NULL(val1));
3619 spou_fam_fams_subs : /* empty */
3620 | spou_fam_fams_subs spou_fam_fams_sub
3623 spou_fam_fams_sub : note_struc_sub
3627 /*********************************************************************/
3629 /*********************************************************************/
3631 no_std_subs : /* empty */
3632 | no_std_subs no_std_sub
3635 no_std_sub : user_sect /* 0:M */
3638 CLOSE { HANDLE_ERROR }
3641 no_std_rec : user_rec /* 0:M */
3644 CLOSE { HANDLE_ERROR }
3647 user_rec : OPEN DELIM opt_xref USERTAG
3648 { if ($4.string[0] != '_') {
3649 if (compat_mode(C_551_TAGS)
3650 && compat_check_551_tag($4.string, &usertag_buffer)) {
3651 $4.string = get_buf_string(&usertag_buffer);
3654 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3661 { struct xref_value *xr = NULL;
3663 xr = gedcom_parse_xref($3, XREF_DEFINED, XREF_USER);
3664 if (xr == NULL) HANDLE_ERROR;
3666 $<ctxt>$ = start_record(REC_USER,
3668 GEDCOM_MAKE_NULL_OR_XREF_PTR(val1, xr),
3670 START($4, $1, $<ctxt>$)
3675 { end_record(REC_USER, $<ctxt>7, GEDCOM_MAKE_NULL(val1)); }
3677 user_sect : OPEN DELIM opt_xref USERTAG
3678 { if ($4.string[0] != '_') {
3679 if (compat_mode(C_551_TAGS)
3680 && compat_check_551_tag($4.string, &usertag_buffer)) {
3681 $4.string = get_buf_string(&usertag_buffer);
3683 else if (compat_mode(C_SUBM_COMM) &&
3684 compat_check_subm_comm($4.string, get_parenttag(0),
3686 $4.string = get_buf_string(&usertag_buffer);
3689 gedcom_error(_("Undefined tag (and not a valid user tag): %s"),
3696 { $<ctxt>$ = start_element(ELT_USER, PARENT, $1, $4, $6, &val2);
3697 START($4, $1, $<ctxt>$);
3702 { end_element(ELT_USER, PARENT, $<ctxt>7,
3703 GEDCOM_MAKE_NULL(val1));
3704 if (compat_mode(C_SUBM_COMM))
3705 compat_close_subm_comm();
3709 user_sects : /* empty */ { }
3710 | user_sects user_sect { }
3711 | user_sects gen_sect
3712 { if (compat_mode(C_SUBM_COMM)) {
3715 gedcom_error(_("Standard tag not allowed in user section"));
3721 opt_xref : /* empty */ { $$ = NULL; }
3722 | POINTER DELIM { $$ = $1; }
3725 opt_value : /* empty */ { GEDCOM_MAKE_NULL(val2);
3727 | DELIM POINTER { struct xref_value *xr
3728 = gedcom_parse_xref($2, XREF_USED,
3730 GEDCOM_MAKE_XREF_PTR(val2, xr);
3732 | DELIM line_item { GEDCOM_MAKE_STRING(val2, $2);
3736 mand_pointer : /* empty */ { gedcom_error(_("Missing pointer")); YYERROR; }
3737 | DELIM POINTER { gedcom_debug_print("==Ptr: %s==", $2);
3741 mand_line_item : /* empty */
3742 { if (compat_mode(C_NO_REQUIRED_VALUES)) {
3743 gedcom_debug_print("==Val: ==");
3747 gedcom_error(_("Missing value")); YYERROR;
3750 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3754 opt_line_item : /* empty */ { $$ = NULL; }
3755 | DELIM line_item { gedcom_debug_print("==Val: %s==", $2);
3759 line_item : anychar { size_t i;
3760 reset_buffer(&line_item_buffer);
3761 /* The following also takes care of '@@' */
3762 if (!strncmp($1, "@@", 3))
3763 SAFE_BUF_ADDCHAR(&line_item_buffer, '@')
3765 for (i=0; i < strlen($1); i++)
3766 SAFE_BUF_ADDCHAR(&line_item_buffer, $1[i])
3767 $$ = get_buf_string(&line_item_buffer);
3769 | ESCAPE { size_t i;
3770 reset_buffer(&line_item_buffer);
3771 for (i=0; i < strlen($1); i++)
3772 SAFE_BUF_ADDCHAR(&line_item_buffer, $1[i])
3773 $$ = get_buf_string(&line_item_buffer);
3777 /* The following also takes care of '@@' */
3778 if (!strncmp($2, "@@", 3))
3779 SAFE_BUF_ADDCHAR(&line_item_buffer, '@')
3781 for (i=0; i < strlen($2); i++)
3782 SAFE_BUF_ADDCHAR(&line_item_buffer, $2[i])
3783 $$ = get_buf_string(&line_item_buffer);
3787 for (i=0; i < strlen($2); i++)
3788 SAFE_BUF_ADDCHAR(&line_item_buffer, $2[i])
3789 $$ = get_buf_string(&line_item_buffer);
3791 | line_item error anychar { HANDLE_ERROR; }
3792 | line_item error ESCAPE { HANDLE_ERROR; }
3795 anychar : ANYCHAR { }
3799 error_subs : /* empty */
3800 | error_subs error_sect
3803 error_sect : OPEN DELIM opt_xref anytag opt_value error_subs CLOSE { }
3806 gen_sect : OPEN DELIM opt_xref anystdtag
3807 { if (compat_mode(C_SUBM_COMM)
3808 && compat_check_subm_comm_cont($4.string)) {
3809 /* Will pass here */
3812 INVALID_TAG($4.string);
3816 { if (compat_mode(C_SUBM_COMM)) {
3817 $<ctxt>$ = compat_subm_comm_cont_start(PARENT, $6);
3821 { if (compat_mode(C_SUBM_COMM))
3822 compat_subm_comm_cont_end(PARENT, $<ctxt>7);
3826 gen_rec : gen_rec_top
3830 gen_rec_norm : OPEN DELIM opt_xref anystdtag
3831 { INVALID_TOP_TAG($4.string) }
3832 opt_value opt_sects CLOSE
3836 gen_rec_top : OPEN DELIM anytoptag
3837 { gedcom_error(_("Missing cross-reference")); YYERROR; }
3838 opt_value opt_sects CLOSE
3842 opt_sects : /* empty */ { }
3843 | opt_sects gen_sect { }
3846 anytag : USERTAG { }
3860 anystdtag : TAG_ABBR
3991 /* Functions that handle the counting of subtags */
3993 int* count_arrays[MAXGEDCLEVEL+1];
3994 char tag_stack[MAXGEDCLEVEL+1][MAXSTDTAGLEN+1];
3995 Gedcom_ctxt ctxt_stack[MAXGEDCLEVEL+1];
3997 void push_countarray(int level)
4000 gedcom_debug_print("Push Count level: %d, level: %d\n", count_level, level);
4001 if (count_level != level + 1) {
4002 gedcom_error(_("Internal error: count level mismatch"));
4005 if (count_level > MAXGEDCLEVEL) {
4006 gedcom_error(_("Internal error: count array overflow"));
4010 gedcom_debug_print("calloc countarray %d\n", count_level);
4011 count = (int *)calloc(YYNTOKENS, sizeof(int));
4012 if (count == NULL) {
4013 gedcom_error(_("Internal error: count array calloc error"));
4017 count_arrays[count_level] = count;
4022 void set_parenttag(const char* tag)
4024 strncpy(tag_stack[count_level+1], tag, MAXSTDTAGLEN+1);
4027 void set_parentctxt(Gedcom_ctxt ctxt)
4029 ctxt_stack[count_level+1] = ctxt;
4032 char* get_parenttag(int offset)
4034 return tag_stack[count_level - offset];
4037 Gedcom_ctxt get_parentctxt(int offset)
4039 return ctxt_stack[count_level - offset];
4042 int count_tag(int tag)
4044 int *count = count_arrays[count_level];
4045 return ++count[tag - GEDCOMTAGOFFSET];
4048 int check_occurrence(int tag)
4050 int *count = count_arrays[count_level];
4051 return (count[tag - GEDCOMTAGOFFSET] > 0);
4054 void pop_countarray()
4057 gedcom_debug_print("Pop Count level: %d\n", count_level);
4058 if (count_level < 0) {
4059 gedcom_error(_("Internal error: count array underflow"));
4063 count = count_arrays[count_level];
4064 gedcom_debug_print("free countarray %d\n", count_level);
4066 count_arrays[count_level] = NULL;
4072 gedcom_debug_print("Cleanup countarrays\n");
4073 while (count_level > 0) {
4079 void cleanup_concat_buffer()
4081 cleanup_buffer(&concat_buffer);
4084 void cleanup_line_item_buffer()
4086 cleanup_buffer(&line_item_buffer);
4089 void cleanup_usertag_buffer()
4091 cleanup_buffer(&usertag_buffer);
4094 /* Enabling debug mode */
4095 /* level 0: no debugging */
4096 /* level 1: only internal */
4097 /* level 2: also bison */
4100 void gedcom_set_debug_level(int level, FILE* f)
4105 trace_output = stderr;
4107 gedcom_high_level_debug = 1;
4116 int gedcom_debug_print(const char* s, ...)
4119 if (gedcom_high_level_debug) {
4122 res = vfprintf(trace_output, s, ap);
4124 fprintf(trace_output, "\n");
4129 /* Setting the error mechanism */
4130 void gedcom_set_error_handling(Gedcom_err_mech mechanism)
4132 error_mechanism = mechanism;